我正在开发一个带有 Angular 和 Cordova 插件的 Android 应用程序,我想将其与 Google 身份验证集成。
我已经安装了cordova-插件-googleplus https://github.com/EddyVerbruggen/cordova-plugin-googleplus我已成功集成到该应用程序中。
当用户登录时,我会收到响应,我可以在其中获取 accessToken、配置文件用户信息和刷新令牌。
现在我想实现一个功能来刷新令牌,而不会每小时用新的提示屏幕打扰用户。
我已成功更新 accessToken,但仅在第一次有效
我用过这两种方式:
- 发送带有以下数据的curl请求
curl -X POST \
'https://oauth2.googleapis.com/token?code=XXXXXXXXXXXXXXXX&client_id=XXXXXXXXXXXXXXXX.apps.googleusercontent.com&client_secret=YYYYYYYYYYYY&grant_type=authorization_code' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/x-www-form-urlencoded'
- 使用 Google API Client Library for Java 在服务器端实现它,主要遵循以下这些code https://googleapis.dev/java/google-api-client/latest/com/google/api/client/googleapis/auth/oauth2/GoogleAuthorizationCodeTokenRequest.html
重点是,当用户第一次登录(使用 cordova-plugin-googleplus)时,我收到一个具有这种格式的刷新令牌
4/rgFU-hxw9QSbfdj3ppQ4sqDjK2Dr3m_YU_UMCqcveUgjIa3voawbN9TD6SVLShedTPveQeZWDdR-Sf1nFrss1hc
如果一段时间后我尝试以上述任何一种方式刷新令牌,我会收到带有新 accessToken 和新刷新令牌的成功响应。新的刷新令牌具有其他格式
1/FTSUyYTgU2AG8K-ZsgjVi6pExdmpZejXfoYIchp9KuhtdknEMd6uYCfqMOoX2f85J
在第二次尝试更新令牌时,我将令牌替换为第一个请求中返回的令牌
curl -X POST \
'https://oauth2.googleapis.com/token?code=1/FTSUyYTgU2AG8K-ZsgjVi6pExdmpZejXfoYIchp9KuhtdknEMd6uYCfqMOoX2f85J&client_id=XXXXXXXXXXXXXXXX.apps.googleusercontent.com&client_secret=YYYYYYYYYYYY&grant_type=authorization_code' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/x-www-form-urlencoded'
但这一次,两种方式(Curl 和 Java)我都遇到了相同的错误。
{
"error" : "invalid_grant",
"error_description" : "Malformed auth code."
}
我读过这个thread https://stackoverflow.com/a/19041051/12155976将 clientId 指定为电子邮件是一个问题,但我还没有发现如何解决它,因为第一次登录是使用客户端 ID“XXXXXXX.apps.googleusercontent.com”完成的,并且如果我设置了来自 google 的电子邮件它说是“未知 Oauth 客户端”的帐户
我希望任何人都可以帮助我,因为我被困了好几天