我有一个离子应用程序,登录用户使用谷歌身份验证。它将id_token和access_token传递给节点服务器,然后节点服务器使用id_token验证用户,并使用access_token调用用户的Google帐户。
当从浏览器使用Ionic应用程序时,它使用gapi登录用户并获取令牌,这很好用。对于iOS和Android,它使用了官方的Cordova插件(cordova- plugin -googleplus)。
对于iOS,插件总是返回两个令牌,一切都很好。对于Android,不会返回任何access_token。因此,我按照说明获取了一个serverAuthCode,这也是有效的。将serverAuthCode换成access_token就是问题所在。
Google官方说明提供了示例请求
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded
code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https://oauth2.example.com/code&
grant_type=authorization_code
我提供了调用中使用的client_id和client_secret来获取serverAuthCode。我验证了我发送的serverAuthCode看起来是正确的,从"4/“开始。redirect_uri有点神秘。我尝试了我能想到的所有方法,包括与client_id相关的授权重定向URI,null,示例中的URI,以及来自web的许多奇怪的建议。无论如何,无论是从应用程序还是从SoapUI,我都会收到
{
"error": "unsupported_grant_type",
"error_description": "Invalid grant_type: "
}
This post似乎在说redirect_uri必须与调用中使用的匹配才能获得serverAuthCode。然而,这是由插件设置的,查看它的代码,我在任何地方都找不到它的设置。
所以我的问题是:谁能告诉我如何在安卓上获得access_token?如果上面的帖子是正确的,有没有办法找出插件使用的是什么redirect_uri?This issue提供了一个让插件直接返回access_token的方法,但也暗示谷歌不赞成使用serverAuthCode,所以从serverAuthCode获取access_code似乎是最好的选择。
(更新:上面的变通方法在我们的情况下也不起作用,所以我们似乎被困在了这一点上)
发布于 2017-10-21 00:12:27
经过几天的尝试,我们终于发现这篇文章的编码不正确。不用说,错误响应中的某种信息会很有帮助--特别是在这种情况下,因为在测试各种正文格式时,可以清楚地看到参数正在被识别,但是仍然会返回一个错误。
仍然不知道为什么在安卓系统上access_token
突然停止返回,这使得这个调用是必要的。希望这能对其他人有所帮助!
发布于 2020-11-12 14:41:34
我也遇到过同样的问题,我发现在重新进行身份验证并获得新代码以再次尝试之后,ID令牌响应正常。
https://stackoverflow.com/questions/46739724
复制相似问题