我有一个Ionic应用程序,使用Google身份验证登录用户。它将id_token和access_token传递给节点服务器,然后节点服务器使用id_token来验证用户,并使用access_token来调用用户的Google帐户。
当从浏览器使用Ionic应用程序时,它使用gapi来记录用户并获取令牌,这样可以正常工作。对于iOS和Android,它使用官方的Cordova插件(cordova-plugin-googleplus)。
对于iOS,插件总是返回两个令牌,一切都很好。对于Android,不会返回任何access_token。因此,我按照说明获取了一个serverAuthCode,这也适用。为access_token交换serverAuthCode是问题所在。
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。然而,这是由插件设置的,看看它的代码我发现它无法在任何地方设置。
所以我的问题是:任何人都可以告诉我如何在Android上获取access_token?如果上面的帖子是正确的,有没有办法找出插件使用的redirect_uri?或者还有另一种方法来获取access_token吗? This issue提供了一个黑客来让插件直接返回access_token,但也暗示Google不赞成使用serverAuthCode,因此最好从serverAuthCode获取access_code。
(更新:上面的解决方法在我们的案例中也不起作用,所以我们似乎陷入了这一点)
答案 0 :(得分:0)
经过几天的尝试,我们终于发现帖子的编码不正确。毋庸置疑,错误响应中的某些信息会有所帮助 - 特别是在这种情况下,因为在测试各种正文格式时,很明显参数被识别,但仍然会返回错误。
仍然不知道为什么在Android上let rec compare' list1 list2 currentOrder =
match list1, list2 with
| [], [] -> currentOrder
| _, [] -> 1
| [], _ -> -1
| car1::cdr1, car2::cdr2 ->
let order =
if car1 > car2 then 1
else if car1 < car2 then -1
else currentOrder
in
compare' cdr1 cdr2 order
突然停止返回,首先需要进行此调用。希望这会有助于其他人!
答案 1 :(得分:0)
我也遇到了同样的问题,我发现重新进行身份验证并获得新的代码以再次尝试后,ID令牌可以正确响应。