https://developers.google.com/identity/sign-in/web/backend-auth

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; ... GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance())
.setAudience(Collections.singletonList(CLIENT_ID))
// Or, if multiple clients access the backend:
//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
.build(); // (Receive idTokenString by HTTPS POST) GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload(); // Print user identifier
String userId = payload.getSubject();
System.out.println("User ID: " + userId); // Get profile information from payload
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
String locale = (String) payload.get("locale");
String familyName = (String) payload.get("family_name");
String givenName = (String) payload.get("given_name"); // Use or store profile information
// ... } else {
System.out.println("Invalid ID token.");
}

我后台完全按照google的文档来,却总是输出Invalid ID token,服务器是在香港,本机调试因为在墙内永远是连接超时。

试了若干方法后,我在网上发现远程调试这个神奇的功能。

remote debug

使用的IDE是idea





(可能需要开启服务器对应端口)





我用的是springboot打包的fatjar,如果是部署到容器中,则把启动选项加到对应容器配置中



这时点这个绿色的小虫子就可以进行调试了(可惜看不到控制台输出内容)

tips



善用这个功能加入需要观察的对象 方框内的都是为了找出问题加进去的

查找问题

逐步配合debug查看源码

  public GoogleIdToken verify(String idTokenString) throws GeneralSecurityException, IOException {
GoogleIdToken idToken = GoogleIdToken.parse(getJsonFactory(), idTokenString);
return verify(idToken) ? idToken : null;
}
  public boolean verify(GoogleIdToken googleIdToken) throws GeneralSecurityException, IOException {
// check the payload
if (!super.verify(googleIdToken)) {//super.verify(googleIdToken) false
return false;
}
// verify signature, try all public keys in turn.
for (PublicKey publicKey : publicKeys.getPublicKeys()) {
if (googleIdToken.verifySignature(publicKey)) {
return true;
}
}
return false;
}
  public boolean verify(IdToken idToken) {
return (issuers == null || idToken.verifyIssuer(issuers))//idToken.verifyIssuer(issuers) true
&& (audience == null || idToken.verifyAudience(audience))//idToken.verifyAudience(audience) true
&& idToken.verifyTime(clock.currentTimeMillis(), acceptableTimeSkewSeconds);//idToken.verifyTime(clock.currentTimeMillis(), acceptableTimeSkewSeconds) false
}
  public final boolean verifyTime(long currentTimeMillis, long acceptableTimeSkewSeconds) {
return verifyExpirationTime(currentTimeMillis, acceptableTimeSkewSeconds)//verifyExpirationTime(currentTimeMillis, acceptableTimeSkewSeconds) true
&& verifyIssuedAtTime(currentTimeMillis, acceptableTimeSkewSeconds);//verifyIssuedAtTime(currentTimeMillis, acceptableTimeSkewSeconds) false
}
  public final boolean verifyIssuedAtTime(long currentTimeMillis, long acceptableTimeSkewSeconds) {
return currentTimeMillis
>= (getPayload().getIssuedAtTimeSeconds() - acceptableTimeSkewSeconds) * 1000;
}

最后currentTimeMillis是下述类中获得的,getPayload().getIssuedAtTimeSeconds()是从解析出的json中获得iat的值,acceptableTimeSkewSeconds=300,于是这里是google服务器返回时间和我们服务器时间在一定范围内(300秒)验证。戏剧性的是我的服务器还正好差了5分钟多一点,于是几乎次次报错,偶尔有一次正常(因为从google获取的时间传到服务器也是需要时间的)。

折磨了我好几天的问题结果只是服务器时间,这里又想吐槽下google的api了,GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance())这行都是我从别的页面找到的结果,它给的一个不用google的库手工验证的方法里也只说了要验证aud,完全没提验证iat这项时间,我也完全没往这边想。

gapi也不是任何时候都能直接调用的,google搜索gapi is not defined一排一排的,完全不提自家js的加载流程,你让咱们猜还是让咱们看源码啊,是不是好让咱创造超越google的互联网公司,出任CEO迎娶白富美走上人生巅峰

服务器时间误差导致的google sign-in后台验证错误(远程调试java程序)的更多相关文章

  1. Java后台验证

    前台的js验证,可以通过其他手段绕过,存在安全问题,所以引入Java后台进行验证 一.导入jar包 此为hibernate-validator jar包,进行Java后台验证使用,在Java 1.9及 ...

  2. WORDPRESS 后台500错误解决方法集合

    引自: http://www.guuglc.com/565.html 这篇文章本质上我是不可能会写到,就因为7号那天晚上,我准备搬家的时候,发现前台完好,进入后台却500错误. 这时我就得急的,毕竟明 ...

  3. C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

    在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基 ...

  4. 如何提高后台服务应用问题的排查效率?日志 VS 远程调试

    转眼间,距离Jerry最近一篇文章推送已经过去了一个多月的时间了. 公众号更新的频率降低,不是因为Jerry偷懒,而是由于从春节过后,我所在的SAP成都研究院数字创新空间整个团队,一直在忙一个5月份需 ...

  5. 服务器发送邮件出现Could not connect to SMTP host错误 解决办法

    服务器发送邮件出现Could not connect to SMTP host错误 解决办法 功夫不负有心人,最后了解到,除了google的smtp服务器收到请求“smtp”会接受,其他服务器比如qq ...

  6. Google Authenticator(谷歌身份验证器)

    <!DOCTYPE html>Google Authenticator(谷歌身份验证器) ] Google Authenticator(谷歌身份验证器) Google Authentica ...

  7. Google Chrome 浏览器的备用(离线)安装程序

    Google Chrome 浏览器的备用(离线)安装程序(适用于 Windows) 如果您在使用 http://www.google.com/chrome 上的标准安装程序下载 Chrome 浏览器时 ...

  8. sign in with apple后端校验(java)

    最近新开发的ios平台的app在提审的时候,被拒了,原因是app上如果有接第三方登陆(比如,微信,微博,facebook等),那就必须要接apple id登陆,坑爹~苹果霸权啊!然而没办法,靠他吃饭, ...

  9. 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...

随机推荐

  1. @PathVariable性能损耗分析

    前端时间参与了一次业务线排障,是接口服务并发性能比较差,性能损耗大的问题,我经过几次研究分析和压测,确定了故障源是@PathVariable耗时过长引起的. @PathVariable使用形式: @R ...

  2. 换个角度使用VUE过滤器

    换个角度使用VUE过滤器 过滤器在Vue中的主要用于文本格式化,如小写转大小,日期格式化等操作.官方对这个功能介绍也很简单,不过确实很简单,就一个函数而已.但最近在做两款APP时,遇到一些特殊的需求. ...

  3. JS数组方法整理(附使用示例)

    整理目前所用过的数组方法,学习了新增的es6方法. 1.arr.push() 从后面添加元素,返回值为添加完后的数组的长度 let arr = [1,2, is 8.3,4,5] console.lo ...

  4. Termux 高级终端安装使用配置教程

    Termux 高级终端安装使用配置教程,这篇文章拖了有小半年.因为网上相关的文章相对来说还是比较少的,恰好今天又刷了机,所以就特意来总结一下,希望本文可以帮助到其他的小伙伴.发挥Android平台更大 ...

  5. Winform将FastReport的report与PreviewControl建立绑定关系

    场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  6. 06 (OC)* iOS中UI类之间的继承关系

    iOS中UI类之间的继承关系 此图可以更好的让你去理解iOS中一些底层的关系.你能够了解以及理解UI类之间的继承关系,你会更加明白苹果有关于底层的东西,更有助于你的项目开发由它们的底层关系,就能更加容 ...

  7. 前端利器躬行记(6)——Fiddler

    Fiddler是一款免费的.基于Windows系统的代理服务器软件(即Web调试抓包工具),由Eric Lawrence用C#语言在2003年10月发布了第一个版本.注意,由于Fiddler依赖Mic ...

  8. [Advanced Python] 14 - "Generator": calculating prime

    高性能编程 几个核心问题 • 生成器是怎样节约内存的?• 使用生成器的最佳时机是什么?• 我如何使用 itertools 来创建复杂的生成器工作流?• 延迟估值何时有益,何时无益? From: htt ...

  9. Oracle中RMAN基本命令教程

    一.target--连接数据库 1.本地: [oracle@oracle ~]$ rman target / 2.远程: [oracle@oracle ~]$ rman target sys/orac ...

  10. 轻松部署calico

    一.资源 官方文档 https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/integration 二. ...