我使用 angularJS Oauth 模块 GAuth.checkAuth() 在应用程序的客户端登录中获得了有效代码。然后是 GAuth.getToken()。
该代码的有效期仅为1小时,任何API(例如GoogleDocs、Gmail)在1小时后访问都会失败,需要重新登录。
为了克服这个问题,我尝试将代码发送到服务器以在服务器上获取 AccessCode,以便我可以将相同的请求发送到 GoogleDocs、Gmail 等
GoogleAuthorizationCodeTokenRequest req =
new GoogleAuthorizationCodeTokenRequest(
new NetHttpTransport(),
JacksonFactory.getDefaultInstance(),
"https://www.googleapis.com/oauth2/v4/token",
// "https://accounts.google.com/o/oauth2/token",
"901142925530-21ia7dqnsdsdsndnsnnnfdc9cm2u07.apps.googleusercontent.com",
"6NSvw0efghyuuG8YGOBWPln79n",
authCode,
"http://localhost:8080");
req.setGrantType("authorization_code");
//req.put("refresh_token", authCode);
//req.put("access_type", "offline");
GoogleTokenResponse tokenResponse =
req.execute();
tokenResponse.getAccessToken()
其中 authCode 是我在 GAuth token 中收到的代码
但是调用失败,我得到响应
400 Bad Request
{
"error" : "invalid_grant",
"error_description" : "Incorrect token type."
}
非常感谢任何帮助!
最佳答案
当用户首次验证您的应用程序时,您将获得一个授权代码。然后,您需要获取此授权代码并将其交换为访问 token 和刷新 token 。授权码一旦使用,将无法再次使用。
grant_type=authorization_code
表示您要求 Google 验证您的授权代码并为您提供新的访问 token 和刷新 token 。
在我看来,您正在获取从该请求返回的访问 token 并将其发送到 grant_type=authorization_code 端点,该端点将无法工作,因为代码类型错误。母鸡您收到的错误
400 Bad Request { "error" : "invalid_grant", "error_description" : "Incorrect token type." }
您需要获取为您提供的刷新 token 。如果有的话,我不确定你是否可以从 AngularJs 获得刷新 token 。不过,您可以使用 java 获得一个。
纯粹休息时访问 token 的刷新将如下所示
https://accounts.google.com/o/oauth2/token
client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token
注意&grant_type=refresh_token
。如果您使用的是 Google api java 客户端库,它应该会为您处理所有这些事情。然而,您的标记有点令人困惑,不清楚您是否尝试在 java 或 angularjs 中执行此操作,我不认为这将允许您使用刷新 token 。再说一次,我不是一个有 Angular 的开发者,在这一点上我可能是错的。
答案:
您发送的代码不是授权代码。只能将授权码发送至 grant_type=authorization_code。解决方案:发送authorization_code
Google 代码和 token 的类型:
对于 Oauth2,您应该了解三种类型的代码或 token 。
- 授权代码。
- 刷新 token
- 访问 token
当您请求用户访问权限并且他们授予您的应用程序访问权限时,您将获得一个授权代码
。授权码的有效期很短,可能不到 10 分钟,并且只能使用一次。
授权代码用于从 google 身份验证服务器获取初始访问 token 和刷新 token 。通过使用 grant_type=authorization_code
访问 token 的有效期约为一个小时。它们用于调用 Google API
https://www.googleapis.com/plus/v1/people/me?access_token={your access token}
假设您没有超出某些配额,您可以在该小时内随意使用访问 token 。
当您当前拥有的访问 token 已过期或者您只需要一个新的访问 token 时,刷新 token 用于向 Google 身份验证服务器请求新的访问 token 。这里的 grant_type=refresh_token
用于请求一个新的访问 token ,您实际上是在告诉谷歌我正在向您发送一个刷新 token ,您知道该怎么做。
补充阅读
我有一些教程可能会对您有所帮助 Google 3 Legged OAuth2 Flow和 Google Developer Console Oauth2 credentials
在学习 Oauth 时也很有帮助:The OAuth 2.0 Authorization Framework
关于java - Google OAuth 返回 invalid_grant token 类型不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41424639/