java - Google OAuth 返回 invalid_grant token 类型不正确

标签 java angularjs google-api google-oauth google-api-js-client

我使用 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 。

  1. 授权代码。
  2. 刷新 token
  3. 访问 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 FlowGoogle Developer Console Oauth2 credentials

在学习 Oauth 时也很有帮助:The OAuth 2.0 Authorization Framework

关于java - Google OAuth 返回 invalid_grant token 类型不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41424639/

相关文章:

java - 第一次使用.JSP;获取 "JSONCore cannot be resolved to a type"(JSONCore 是本地类)

javascript - 如何获取选中的复选框值并将其存储在angularjs中的数组变量中?

javascript - 为什么/什么时候 ng-content b 会是一个好的实践?

android - 仅限我所在国家/地区的 Google map ?

java - 当 "streaming"是 ResultSet 时,MySQL Connector/J 是否缓冲行?

java - JPanel 对象位于底部

javascript - 将 Angular 2 路由器向后移植到 Angular 1 有进展吗?

googleapi : Error 400: Dataset myProject:myDataset is still in use, resourceInUse

javascript - 谷歌图表 API : Change color on hovering legend

java - 使用 Java 和 RichFaces 构建 XML 编辑器