剪影和移动应用程序

时间:2015-08-15 15:29:10

标签: scala authentication playframework playframework-2.4

我使用了例如play-silhouette-angular-seed。 通过Satellizer授权工作正常。

当我尝试通过iOs app进行授权时,我收到了下一个错误:

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()))))

我在此功能中从OAuth2Provider.scala获得了错误400:

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))
}

}

2 个答案:

答案 0 :(得分:1)

此错误已经上升,因为通过Facebook进行身份验证的卫星向服务器发送了一个'验证码'和Silhouette服务器使用此代码来获取Facebook'访问令牌'并创建用户。

相反,Facebook iOs SDK获得了访问令牌'并且我已经尝试将其发送到Json的服务器中,以及“#code;'喜欢'卫星。

要解决此问题,我会发送一个访问令牌'在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应用程序中使用它来获取资源。

答案 1 :(得分:0)

OAuth2Provider获得无法解析的响应(即任何非成功响应)时,会发生这种情况。因此,此错误可能有很多原因,例如授权代码无效或已过期,或者您尚未正确配置redirect_uri(请检查Facebook开发站点上的Facebook应用程序配置以设置redirect_uri)。

Silhouette会记录从Facebook获得的响应,这可以帮助您调试实际问题,要查找的日志行位于您提供的代码段中:

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

因此,请检查您的日志,您应该看到来自Facebook的回复,可能会显示错误,指出他们无法为您提供access_token