Google OAuth返回invalid_grant令牌类型不正确

时间:2017-01-02 10:01:42

标签: java angularjs google-api google-oauth gapi

我使用angularJS Oauth模块GAuth.checkAuth()在我的应用程序的客户端登录上获得了有效的代码。然后是GAuth.getToken()。

该代码仅在1小时内有效,任何API如GoogleDocs,1小时后访问的Gmail失败并需要重新登录。

为了解决这个问题,我尝试将代码发送到服务器以获取服务器上的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."
}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

当用户首次验证您的应用程序时,您将获得授权码。然后,您需要获取此授权代码并将其交换为访问令牌和刷新令牌。一旦使用授权码,就无法再次使用。

  

grant_type = authorization_code

表示您要求Google验证您的授权码并为您提供新的访问令牌和刷新令牌。

听起来,您正在接受从该请求返回的访问令牌,并将其发送到grant_type = authorization_code端点,这将不会使用错误类型的代码。母鸡你得到的错误

  

400 Bad Request {“error”:“invalid_grant”,“error_description”:“令牌类型不正确。” }

您需要获取给定的刷新令牌。如果有一个我不确定你甚至可以从AngularJs获得刷新令牌。你可以使用java获得一个。

在纯静态中刷新访问令牌将如下所示

  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中尝试这样做我不相信会让你使用刷新令牌。我再也不是一个有角度的开发者,我在这一点上可能是错的。

<强> Anwser:

您发送的代码不是授权代码。只能将授权码发送到grant_type = authorization_code。解决方案:发送 authorization_code

Google代码和令牌的类型:

使用Oauth2时,您应该注意三种类型的代码或令牌。

  1. 授权码。
  2. 刷新令牌
  3. 访问令牌
  4. 当您请求访问用户并授予您的应用程序访问权限时,您将获得Authorization code。授权代码是短暂的,可能不到10分钟,它只能使用一次。

    授权代码用于从googles身份验证服务器获取初始访问令牌和刷新令牌。使用grant_type=authorization_code

    访问令牌大约需要一个小时。它们用于调用Google API

    https://www.googleapis.com/plus/v1/people/me?access_token={your access token}
    

    假设您没有超出某些配额,您可以在该时间内随时使用访问令牌。

    当您当前的访问令牌已过期或您只想要一个新令牌时,刷新令牌用于从Google身份验证服务器请求新的访问令牌。这里grant_type=refresh_token用于请求一个新的访问令牌,你实际上是在告诉谷歌我正在向你发送一个你知道该怎么做的刷新令牌。

    额外阅读

    我有一套教程,可以帮助你Google 3 Legged OAuth2 FlowGoogle Developer Console Oauth2 credentials

    学习Oauth时也很有用:The OAuth 2.0 Authorization Framework