在验证服务器端的令牌时获取无效授权,格式错误的身份验证代码

时间:2018-03-16 00:26:25

标签: java google-oauth

我们正在尝试在我们的产品中使用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();

以下是我在客户端获取accessstoken的方法:

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

如果我尝试从客户端访问配置文件和电子邮件,它可以正常工作。相同的令牌在服务器端不起作用会导致格式错误的令牌异常。

2 个答案:

答案 0 :(得分:1)

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

URL哈希片段中的授权代码由encodeURIComponent api编码,因此,如果您传递此代码以请求访问令牌。它将引发错误:

{ "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处理代码。

答案 1 :(得分:0)

感谢 slideshowp2 的回答和 Subhadeep Banerjee 的评论。

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

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

附言这是关于encodedURL

的一些信息

因为我们的内容类型:application/x-www-form-urlencoded