我正在将Google注册/登录添加到我的Web应用程序中,遇到了问题。
这是我的代码:
private static final HttpTransport transport = new NetHttpTransport();
private static final JsonFactory jsonFactory = new JacksonFactory();
private static final String MY_APP_GOOGLE_CLIENT_ID = "wouldntyouliketoknow";
public UsernamePasswordAuthenticationToken verify(final String idTokenString){
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
.setAudience(Collections.singletonList(MY_APP_GOOGLE_CLIENT_ID))
.build();
try {
GoogleIdToken idToken = verifier.verify(idTokenString);// <-- verifier.verify returns null !!!
if (idToken != null) {
Payload payload = idToken.getPayload();
String email = payload.getEmail();
if(Boolean.valueOf(payload.getEmailVerified())){
UserJPA jpa = userRepository.findByEmail(email);
if(jpa==null){
throw new UsernameNotFoundException("Cannot find user with email = "+email);
}
if(!jpa.isRegisterredWithGoogle()){
throw new UsernameNotFoundException("This user did not use the 'Register with google' option.");
}
bokiAuthenticationProvider.checkUserActiveAndUnlocked(jpa);
return new UsernamePasswordAuthenticationToken(jpa.getUsername(), jpa.getPasswordHesh(),
bokiAuthenticationProvider.getAuthorities(jpa.getUserHasRoleSecurityList()));
}
}else{
System.out.println("The *idToken* object is null !!!");
}
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
}
throw new MyCustomException("Google token is invalid or has expired");
}
为了创建我的CLIENT_ID,我按照下面链接中的说明操作:
https://developers.google.com/identity/sign-in/web/devconsole-project
问题是verifier.verify一直返回null。
我检查过了:
- 我的用户没有注册与谷歌和数据库字段正确填写
- 每次我尝试google_sign_in时,我都会从google得到不同的字符串标记
- 我的CLIENT_ID在Google控制台中有效且处于活动状态。
更令人困惑的是,就在一个月前,这一切还运作得很好。我请了病假,当我回来的时候,我的老板用这个问题欢迎我。
有人知道可能发生了什么吗?
6条答案
按热度按时间d5vmydt91#
我终于想明白了。
由于没有人知道如何帮助我,我放弃了指定的Google库,从头开始进行自己的令牌验证。
我在这里使用了google-token-verifier-url-tool:
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
在页面底部这里:
https://developers.google.com/identity/protocols/OpenIDConnect
我想知道如何破解JSON。
我所做的是,我用代码联系他们的在线工具,获得JSON响应并手动验证它。这是我的代码:
一旦我有了这个详细的验证,我就能确切地看到错误在哪里。前端向我发送了一个无效的CLIENT_ID值。[抱怨,抱怨]我问了他们一百次,他们告诉我这些值匹配。呸!
因此,错误不是在我用于令牌验证的原始代码中的某个地方,而是在我的办公室中的通信错误。
为了安全起见,我将恢复到原始代码,这次使用正确的CLIENT_ID。尽管如此,我必须对谷歌图书馆提出一个抱怨-它从来没有告诉我为什么令牌验证失败。我花了好几天的时间才终于弄明白。我知道他们这么做是出于安全考虑,但缺乏支持还是让人恼火。
xienkqul2#
有类似的问题。这是如此愚蠢,但我只是在我的服务器上有错误的时间。我认为验证总是失败,因为令牌的到期时间在我的服务器时间宇宙中结束。
shyt4zoc3#
对于那些仍然有这个问题的人:
1.尝试python示例(https://developers.google.com/identity/sign-in/web/backend-auth#python),以确保您使用正确的CLIENT_ID,如果没有,您将看到具有正确CLIENT_ID的异常消息
1.使用
1.31.3
版本的com.google.api-client
和1.31.4
版本的com.google.oauth-client
1.将
com.google.api.client.json.gson.GsonFactory
用作JsonFactory
g6ll5ycj4#
我通过从客户端发送
idToken
而不是authToken
解决了我的问题vm0i2vca5#
不知道是否有人还在看这个,但来自谷歌GitHub的代码实际上为我解决了这个问题。https://github.com/googlearchive/gplus-verifytoken-java/tree/master/src/com/google/plus/samples/verifytoken
他们提到,该项目已不再积极维护,但仍作为这项工作的存档。
bqf10yzr6#
我发现了两个原因为什么它会发生。
1.使用Google登录时生成的令牌ID已过期。通常在1小时后过期。
刷新授权令牌的解决方案:
成功登录后,我们在响应对象上获得一个reloadAuthResponse方法。此外,我们还获得了expires_in属性,它给出了令牌过期的毫秒数。下面是使用它的代码片段。
这里,handleSuccessfulGoogleResponse()在成功登录时执行。我们在其中调用refreshTokenGenerator(),它使用expires_in属性(如果它存在,否则默认为3600ms)。然后,我们使用setTimeout()执行函数,在当前令牌过期之前生成新令牌。