2015-08-15 4 views
2

Я использовал в качестве примера игру-силуэт-угловое семя. Авторизация через Satellizer работает нормально.Силуэт и мобильное приложение

При попытке разрешить через Ios приложение, которое я получил следующую ошибку:

com.mohiva.play.silhouette.impl.exceptions.UnexpectedResponseException: 
[Silhouette][facebook] Cannot build OAuth2Info because of invalid response format: 
List((/access_token,List(ValidationError(List(error.path.missing),WrappedArray())))) 

я получил ошибку 400 в этой функции от OAuth2Provider.scala:

protected def getAccessToken(code: String)(implicit request: RequestHeader): Future[OAuth2Info] = { 
httpLayer.url(settings.accessTokenURL).withHeaders(headers: _*).post(Map(
    ClientID -> Seq(settings.clientID), 
    ClientSecret -> Seq(settings.clientSecret), 
    GrantType -> Seq(AuthorizationCode), 
    Code -> Seq(code), 
    RedirectURI -> Seq(resolveCallbackURL(settings.redirectURL))) ++ settings.accessTokenParams.mapValues(Seq(_))).flatMap { response => 
    logger.debug("[Silhouette][%s] Access token response: [%s]".format(id, response.body)) 
    Future.from(buildInfo(response)) 
} 

}

ответ

1

Этот ошибка была повышена, потому что Satellizer для аутентификации через Facebook отправляет серверу «код аутентификации», а сервер Silhouette использует этот код, чтобы получить токен доступа к Facebook и создать пользователя.

Facebook iOs SDK вместо этого получил «токен доступа», и я попытался отправить его на сервер в Json в поле «code», например «Satellizer».

Чтобы решить эту проблему, я посылаю «маркер доступа» в поле Json под названием «access_token» и использовать следующий код для проверки подлинности мобильных приложений:

class MobileSocialAuthController @Inject() (
    val messagesApi: MessagesApi, 
    userService: UserService, 
    authInfoRepository: AuthInfoRepository, 
    socialProviderRegistry: SocialProviderRegistry, 
    val env: Environment[User, JWTAuthenticator]) 
    extends Silhouette[User, JWTAuthenticator] 
{ 
    def authenticate(provider: String) = UserAwareAction.async(parse.json) { 
    implicit request => 
     provider match { 
     case "facebook" => 
      request.body.asOpt[OAuth2Info] match { 
      case Some(authInfo) => 
       (socialProviderRegistry.get[FacebookProvider](provider) match { 
       case Some(p: FacebookProvider) => 
        for { 
        profile <-p.retrieveProfile(authInfo) 
        user <- userService.save(profile) 
        authInfo <- authInfoRepository.save(profile.loginInfo, authInfo) 
        authenticator <- env.authenticatorService.create(profile.loginInfo) 
        token <- env.authenticatorService.init(authenticator) 
        } yield { 
        env.eventBus.publish(LoginEvent(user, request, request2Messages)) 
        Ok(Json.obj("token" -> token)) 
        } 
       case _ => Future.failed(new ProviderException(s"Cannot authenticate with unexpected social provider $provider")) 
       }).recover { 
       case e: ProviderException => 
        logger.error("Unexpected provider error", e) 
        Unauthorized(Json.obj("message" -> Messages("could.not.authenticate"))) 
       } 
      case _ => 
       Future(BadRequest(Json.obj(
       "message" -> "Bad OAuth2 json."))) 
      } 
     case _ => 
      Future(BadRequest(Json.obj(
      "message" -> "You can use only Facebook account for authentication."))) 
     } 
    } 
} 

В результате, у меня есть маркер, который я использую в ios для получения ресурсов.

+0

Я получаю неавторизованные ответы 'Unauthorized' при попытке использовать ваше решение. Были ли какие-либо другие проблемы, с которыми вы столкнулись? – crockpotveggies

0

Это происходит, когда OAuth2Provider получает ответ, который он не может проанализировать, то есть любой ответ без ответа. Таким образом, может быть много причин для этой ошибки, например, код авторизации недействителен или истек, или вы неправильно настроили redirect_uri (проверьте настройку своего приложения Facebook на сайте разработчиков Facebook, чтобы установить redirect_uri).

силуэт делает журнал ответ он получает от Facebook, которая должна помочь вам отлаживать, что фактическая проблема, линия журнал искать в сниппет вы предоставили:

logger.debug("[Silhouette][%s] Access token response:... 

Так проверьте ваши журналы, там вы должны увидеть ответ от Facebook, вероятно, с ошибкой, указывающей, почему они не могли дать вам access_token.

Смежные вопросы