我使用了例如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))
}
}
答案 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
。