当前位置: 首页 > 知识库问答 >
问题:

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

宋宏毅
2023-03-14

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

通用域名格式。谷歌。应用程序编程接口。客户啊。oauth2。TokenResponseException:400错误请求

{
“错误”:“授权无效”,“错误描述”:“身份验证代码格式错误”
}

在com.google.api.client.auth.oauth2。xception.fromxception.java:105

在com.google.api.client.auth.oauth2。TokenRequest.execute未解析(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();

以下是如何在客户端获取accesstoken:

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

令牌在发送到服务器的过程中没有损坏,它是:

雅29.Glx_BUjV_zIiDzq0oYMqoXkxz8VGzt8GCQuBiaaJ3FxN0qaLxbBXvnWXjNKZbpeu4jraoEqw6Mj9D7LpTx_8Ts_8TH0VGT5cbrooGcAOF0wKMc1DDEjm6p5m-MvtFA

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

共有3个答案

尉迟国发
2023-03-14

对于任何未来可能面临这种情况的人。我遇到了这个问题,decodeURIComponent无法与我合作。前面的答案适用于不同的问题。

从问题本身可以看出,标记以ya29开头

ya29.Glx_BUjV_zIiDzq0oYMqoXkxz8VGzt8GCQuBiaaJ3FxN0qaLxbBXvnWXjNKZbpeu4jraoEqw6Mj9D7LpTx_8Ts_8TH0VGT5cbrooGcAOF0wKMc1DDEjm6p5m-MvtFA

但这对服务器端登录不起作用。所以,当使用一些谷歌客户端库时,请注意,有两个变量需要检查:

  • access_type:离线
  • 响应类型:code

一旦你用这些字段配置谷歌客户端库,你可以看到登录的响应会变成这样

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

然后您可以将代码发送到后端,它将工作。

朱鸿畅
2023-03-14

感谢幻灯片2的回答和Subhadeep Banerjee的评论。

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

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

p、 这里是一些关于encodedURL的信息

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

伍光济
2023-03-14

我正在使用节点。jsgoogleapis客户端库,以下是我的案例:

url哈希片段中的授权代码由encodeURIComponentapi编码,因此如果您将此代码传递给请求访问令牌。它将抛出一个错误:

{“error”:“invalid_grant”,“error_description”:“格式错误的身份验证代码”。}

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

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

解码后,授权码为:

"4/_QCXwy-PG5Ub_JTiL7ULaCVb6K-Jsv45c7TPqPsG2-sCPYMTseEtqHWcU_ynqWQJB3Vuw5Ad1etoWqNPBaGvGHY"

在Java中,也许可以使用urldecker。解码处理代码。

 类似资料:
  • 我使用电话身份验证在react native应用程序中使用这个文档,我在一些不同的设备中测试了它。有时电话可以工作,但有时会抛出此错误 firebase phone身份验证错误:无效令牌。在nativeToJSError 我已经浏览了firebase的文档,并试图理解这个错误。下面是我的代码片段:

  • 我们正在尝试找出IPC身份验证和授权的最佳实践。我会解释的。我们有一个基于微服务的体系结构SaaS和一个专门的认证服务。该服务负责执行身份验证和管理身份验证令牌(JWT)。 现在的问题是如何验证和授权由其他服务发起的请求(没有特定用户的上下文)? 我们是否应该为每个服务生成一个专用用户,并像对待系统中的任何其他用户一样对待它(具有适当的权限)? 我们是否应该在服务之间部署“硬编码”/动态令牌? 还

  • 踏频/临时是否提供任何类型的身份验证和授权机制来访问节奏服务器/Web-ui以及节奏/时态服务器与工作流/活动工作者之间的通信。我找不到任何关于此的文档。

  • 我询问了如何建立一个服务呼叫,并在HttpClient上获得了一个很好的信息。然而,虽然这个问题在技术上得到了回答,但我还是被卡住了。 在控制台中,我可以看到我的浏览器向服务发送了什么请求来获取授权令牌。然而,当我尝试在我的服务层中模拟构建请求的调用时,我得到以下错误消息。我在这里犯错的可能性很大。不知道该用谷歌搜索什么,真的。。。 "StatusCode: 500, ReasonPhrase:'

  • 我有一个LaravelAPI(实际上是LumenAPI)服务于VueJS前端。Vue应用程序允许用户登录到谷歌。然后将Google令牌发送回Lumen API,后者使用Google验证令牌,然后验证电子邮件地址是否为有效用户。然后它生成一个令牌,与用户一起存储在数据库中,并返回用户对象。 我没有使用Passport或jwt auth之类的东西。那么现在,我如何使用默认的Auth中间件来验证(现在已