【问题标题】:Getting Invalid grant, malformed auth code while verifying token on server side在服务器端验证令牌时获取无效授权、格式错误的身份验证代码
【发布时间】:2022-04-05 20:14:50
【问题描述】:

我们正在尝试在我们的产品中使用 Google OAuth。流程是让客户端从用户那里获取身份验证并将令牌发送到服务器。在服务器端,我需要验证令牌是否有效。目前,我使用 Google 提供的 OAuth2Sample 作为客户端。当我在服务器端验证发送的令牌时,出现以下异常:

com.google.api.client.auth.oauth2.TokenResponseException: 400 错误请求

{
“错误”:“invalid_grant”,
"error_description" : "验证码格式错误。"
}

在 com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)

在 com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287) 在 com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest.execute(GoogleAuthorizationCodeTokenRequest.java:158)

这是服务器端的代码:

GoogleTokenResponse tokenResponse =
              new GoogleAuthorizationCodeTokenRequest(
                  new NetHttpTransport(),
                  JacksonFactory.getDefaultInstance(),
                  "https://www.googleapis.com/oauth2/v4/token",

                  CLIENT_ID,
                  CLIENT_SECRET,

                  authToken, //Sent from the client
                  "")  // specify an empty string if you do not have redirect URL
                  .execute();

这是我在客户端获取访问令牌的方式:

private static final List<String> SCOPES = Arrays.asList(
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email");
//...

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        httpTransport, JSON_FACTORY, 
clientSecrets, //Client ID and Client Secret
SCOPES).setDataStoreFactory(
        dataStoreFactory).build();

LocalServerReceiver lsr = new LocalServerReceiver();
Credential cr = new AuthorizationCodeInstalledApp(flow, lsr).authorize("user");
return cr.getAccessToken(); //send this to server for verification

令牌在前往服务器的途中没有损坏,它是:

ya29.Glx_BUjV_zIiDzq0oYMqoXkxz8VGzt8GCQuBiaaJ3FxN0qaLxbBXvnWXjNKZbpeu4jraoEqw6Mj9D7LpTx_8Ts_8TH0VGT5cbrooGcAOF0wKMc1DDEjm6p5m-MvtFA

如果我尝试从客户端访问个人资料和电子邮件,它工作正常。相同的令牌在服务器端不起作用得到格式错误的令牌异常。

【问题讨论】:

  • 问题解决了吗?

标签: java google-oauth


【解决方案1】:

我正在使用Node.js googleapis 客户端库,这是我的情况:

url hash 片段中的授权码是由encodeURIComponentapi 编码的,所以如果你通过这个码来请求访问令牌。会报错:

{ "error": "invalid_grant", "error_description": "Malformed auth code." }

所以我使用decodeURIComponent来解码授权码。

decodeURIComponent('4%2F_QCXwy-PG5Ub_JTiL7ULaCVb6K-Jsv45c7TPqPsG2-sCPYMTseEtqHWcU_ynqWQJB3Vuw5Ad1etoWqNPBaGvGHY')

解码后授权码为:

"4/_QCXwy-PG5Ub_JTiL7ULaCVb6K-Jsv45c7TPqPsG2-sCPYMTseEtqHWcU_ynqWQJB3Vuw5Ad1etoWqNPBaGvGHY"

在Java中,也许你可以使用URLDecoder.decode处理代码。

【讨论】:

  • 突然间,谷歌似乎正在对授权码进行编码。虽然我使用的是 Postman,但解码 auth 代码对我有用。谢谢!
【解决方案2】:

感谢 slideshowp2 的回答,以及 Subhadeep Banerjee 的评论。

我正在使用带有 HTTP/REST 的服务器端 Web 应用程序,也面临同样的问题 是的,原因是从 URL 返回的授权码是经过编码的。

解码后,一切正常以获取访问令牌。

附言这是关于encodedURL的一些信息

因为我们的 Content-Type: application/x-www-form-urlencoded

【讨论】:

    【解决方案3】:

    对于将来可能面临这种情况的任何人。我遇到了这个问题,decodeURIComponent 没有 没有和我一起工作。以前的答案适用于不同的问题。

    从问题本身可以看出token是以ya29.开头的

    ya29.Glx_BUjV_zIiDzq0oYMqoXkxz8VGzt8GCQuBiaaJ3FxN0qaLxbBXvnWXjNKZbpeu4jraoEqw6Mj9D7LpTx_8Ts_8TH0VGT5cbrooGcAOF0wKMc1DDEjm6p5m-MvtFA
    

    表示该令牌是在线令牌。在线登录的情况下,可以看到回复是这样的

    但这不适用于服务器端登录。因此,在使用某些 Google 客户端库时,请注意有两个变量需要检查:

    • access_type:offline
    • 响应类型:code

    使用这些字段配置 Google 客户端库后,您会看到登录的响应将更改为类似这样的内容

    {
        "code": "4/0AX4XfWgaJJc3bsUYZugm5-Y5lPu3muSfUqCrpY5KZoGEGAHuw0jrkg_xkD_RX-6bNUq-vA"
    }
    

    然后你可以将该代码发送到后端,它就会工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 2015-11-02
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多