我们正在尝试在我们的产品中使用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
如果我尝试从客户端访问个人资料和电子邮件,效果很好。相同的令牌在服务器端不起作用。获取格式错误的令牌异常。
对于任何未来可能面临这种情况的人。我遇到了这个问题,decodeURIComponent
无法与我合作。前面的答案适用于不同的问题。
从问题本身可以看出,标记以ya29开头
ya29.Glx_BUjV_zIiDzq0oYMqoXkxz8VGzt8GCQuBiaaJ3FxN0qaLxbBXvnWXjNKZbpeu4jraoEqw6Mj9D7LpTx_8Ts_8TH0VGT5cbrooGcAOF0wKMc1DDEjm6p5m-MvtFA
但这对服务器端登录不起作用。所以,当使用一些谷歌客户端库时,请注意,有两个变量需要检查:
access_type:离线
- 响应类型:
code
一旦你用这些字段配置谷歌客户端库,你可以看到登录的响应会变成这样
{
"code": "4/0AX4XfWgaJJc3bsUYZugm5-Y5lPu3muSfUqCrpY5KZoGEGAHuw0jrkg_xkD_RX-6bNUq-vA"
}
然后您可以将代码发送到后端,它将工作。
感谢幻灯片2的回答和Subhadeep Banerjee的评论。
我正在使用带有HTTP/REST的服务器端web应用程序,也面临同样的问题,是的,原因是URL返回的授权码是经过编码的。
解码后,一切正常,以获得访问令牌。
p、 这里是一些关于encodedURL的信息
因为我们的内容类型:application/x-www-form-urlencoded
我正在使用节点。js
googleapis客户端库,以下是我的案例:
url哈希片段中的授权代码由encodeURIComponent
api编码,因此如果您将此代码传递给请求访问令牌。它将抛出一个错误:
{“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中间件来验证(现在已