在SpringBoot项目上构建JWT访问token和刷新token时,遇到一个Date类型的问题,由于序列化JWT token时只支持秒,将毫秒级自然丢弃

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version>
</dependency>

如果有基于签发时间戳(iat,IssuedAt)的应用,需要特别小心,这是一个坑,比如作为验证。

解析分发的token,包括exp,nbf,iat:

{..."exp": 1594351823,"iat": 1593747023,...
}

发现都是秒级而非毫秒级的,一般代码中,我们会使用毫秒timestamp:

//签发时间
final Date issusedAtTime = new Date();
jwtBuilder.withIssuedAt(issusedAtTime);long timestamp = issusedAtTime.getTime();

经过读JWT源码分析,序列化主要是PayloadSerializer,通过方法dateToSeconds明确了JWT中的日期全部按秒序列化

public class PayloadSerializer extends StdSerializer<ClaimsHolder> {....private long dateToSeconds(Date date) {return date.getTime() / 1000L;}
}

顺便研究了下解析类PayloadDeserializer,通过方法getDateFromSeconds将秒级的日期,转换为毫秒然后构造Date对象:

class PayloadDeserializer extends StdDeserializer<Payload> {....  public Payload deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {Map<String, JsonNode> tree = (Map)p.getCodec().readValue(p, new TypeReference<Map<String, JsonNode>>() {});if (tree == null) {throw new JWTDecodeException("Parsing the Payload's JSON resulted on a Null map");} else {String issuer = this.getString(tree, "iss");String subject = this.getString(tree, "sub");List<String> audience = this.getStringOrArray(tree, "aud");Date expiresAt = this.getDateFromSeconds(tree, "exp");Date notBefore = this.getDateFromSeconds(tree, "nbf");Date issuedAt = this.getDateFromSeconds(tree, "iat");String jwtId = this.getString(tree, "jti");return new PayloadImpl(issuer, subject, audience, expiresAt, notBefore, issuedAt, jwtId, tree, this.objectReader);}}....Date getDateFromSeconds(Map<String, JsonNode> tree, String claimName) {JsonNode node = (JsonNode)tree.get(claimName);if (node != null && !node.isNull()) {if (!node.canConvertToLong()) {throw new JWTDecodeException(String.format("The claim '%s' contained a non-numeric date value.", claimName));} else {long ms = node.asLong() * 1000L;return new Date(ms);}} else {return null;}}....
}

至此,破案成功!

[JWT]Auth0的JWT时间序列化问题相关推荐

  1. API接口之JWT设置token过期时间(二)

    目录 1.什么是Jwt 2.token是什么 3.为什么要使用token 4.如何实现token 5.JWT的简单案例 6.API接口token案例 6.1 token的创建 6.2 用户验证流程 7 ...

  2. JWT 的 Token 过期时间为什么没有生效

    在我第一次在 DRF(Django REST Framework)中使用 JWT 时,感觉 JWT 非常神奇,它即没有使用 session.cookie,也不使用数据库,仅靠一段加密的字符串,就解决了 ...

  3. thinkphp3 php jwt,ThinkPHP5 使用 JWT 进行加密

    - 使用 Composer安装此扩展 - 代码示例<?php /** * [InterCommon-接口公用] * @Author RainCyan * @DateTime 2019-08-12 ...

  4. Go语言使用golang-jwt/jwt/v4进行JWT鉴权

    文章目录 1.什么是JWT 2.JWT的数据结构 2.1 Header 2.2 Payload 2.3 Signature 2.4 Base64URL 3使用JWT 安装 生成Token 参考: 最近 ...

  5. 什么是 JWT? 如何基于 JWT 进行身份验证?

    什么是 JWT? JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制.从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化 ...

  6. php jwt是什么,JWT是什么?对JWT的简单认识

    本篇文章给大家带来的内容是关于JWT是什么?对JWT的简单认识,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt. ...

  7. 一、什么是JWT?了解JWT,认知JWT

    首先jwt其实是三个英语单词JSON Web Token的缩写.通过全名你可能就有一个基本的认知了.token一般都是用来认证的,比如我们系统中常用的用户登录token可以用来认证该用户是否登录.jw ...

  8. 相对时间表达式 —— 解决相对时间序列化的问题

    平时开发监控系统时免不了与时序数据库的查询打交道,在查时序数据库时 时间范围 是必不可少的条件,所以在查询的UI展示上通常会将时间范围作为一个独立的组件来让用户交互. 时间范围通常会展示为两种形式:相 ...

  9. 关于auth0的jwt

    JWT(Json Web Token) 用于无法产生cookie的项目(App/微信小程序 ) 同时解决了分布式中session共享的问题(登陆信息以非对称加密的形式存在客户端中,只消耗cpu以及网络 ...

最新文章

  1. Java中的BigDecimal类你真的了解吗?
  2. 【线性规划和网络流24题】
  3. 2017-2018-1 20155201 实验五 通讯协议设计
  4. 这个德国山寨工厂靠抄袭干到240亿,让硅谷恨之入骨
  5. C#中dynamic、ExpandoObject 的正确用法
  6. c# 扩展方法奇思妙用基础篇八:Distinct 扩展(转载)
  7. golang获取文件创建时间,最后访问时间,最后修改时间
  8. 2019蓝桥杯省赛---java---A---6(完全二叉树的权值)
  9. View 绘制体系知识梳理(7) getMeasuredWidth 和 getWidth 的区别
  10. git根据commit生成patch(转载)
  11. onclick与addEventListener的区别
  12. python3调用js_关于python3运行JS文件的问题
  13. C++ 多线程系统编程精要
  14. C# 将Big5繁体转换简体GB2312的代码
  15. 不同格式导入EndNote方法总结
  16. 上海居住证积分全流程
  17. 史上最全超级金融知识(珍藏版)
  18. 基于SVM算法的男女生分类器
  19. 流行的任天堂电子游戏模拟器 Cemu 计划开源并支持 Linux
  20. C1. Pokémon Army (easy version)

热门文章

  1. PNG图片怎么转换成JPG图片
  2. 向技术的长征:一家中国互联网巨头从商业驱动转向技术驱动的努力
  3. Jmeter插件duang duang duang 学会模拟各种场景
  4. 变频电机转矩频率特性曲线_电机转矩与变频器的关系以及变频调速时的机械特性分析...
  5. 学习笔记:利用CNNs进行图像分类
  6. 树莓派4b+esp8266 mini D1 制作AWTRIX网红个性时钟~
  7. 大陆清华刷新计算性能纪录,领跑ASC13超算总决赛
  8. 网页游戏一个服务器多少人,网页游戏开服数据报告
  9. 啄木鸟巡护系统架构演进过程
  10. FZU1669 Right-angled Triangle 本原毕达哥斯拉三元组 特殊不定方程的应用