您的位置 首页 php

JWT在开发中的实战操作(附带生产级别代码)

熬夜熬到差不多晚上2点写的,有用的兄弟,必须给我一个关注和大大的赞了!!!!

发了上一篇 jwt 相关后 后反响热烈。如果没有来得及去看的话建议先看上一篇。

但是也遗留了一些问题。应广大读者的要求。所以从实战角度出发解决这些问题。我们基于 springboot 2.1.6.RELEASE 版本搞一些操作来演示如何在实际开发中使用jwt。主要依赖如下

通过spring security 和jwt 进行结合来完整实现基于jwt 的安全控制。 spring-security-jwt 是spring官方的jwt工具包 。 核心方法只有一个: org.springframework.security.jwt.JwtHelper; 我们用到的就2个方法,其他自己学习:

  • encode(CharSequence content, Signer signer) 顾名思义 编码 需要指定payload 跟签名算法
  • decodeAndVerify(String token, SignatureVerifier verifier) 方法 用来 验证token是否合法 同时解码 payload成明文 这里不验证过期时间

这样生成jwt 和验证解密jwt 的方法都有了,我们编写自己的jwt生成方法。还是先设计一下流程:

  • 用户登录 验证通过 返回其两个token
  • access_token 用来日常使用 Bearer Token 过期时间7天(也可以自定义)
  • refresh_token 用来令牌续期。 过期时间大于access_token 。 当refresh_token不过期,能为access_token 续期。
  • 上述两个token总是成对出现。

根据生成jwt的方法我们需要进行签名算法实现。这里我们采用 RSA算法 。通过java 提供的 keytool 生成jks文件 或者store 或者公私钥串,看你爱好。我这里生成jks文件作为公私钥存储介质。放到资源目录下, 然后解析jks的核心方法为:

获取钥匙对配合上面的JwtHelper 我们就能生成自己的jwt token了。jwt token 是可以携带信息的,所以我们会定义一个JwtClaims 作为jwt中间那一段的定义类。生成器方法如下:

因为上面说了token 成对出现 所以对外我们提供一个TokenPairBuilder 来生成token对。同时为了处理续期问题和校验问题我们把这个token对放入redis。过期时间按照refresh_token的时间来算。这样当access_token过期 就通过refresh 来刷新,当两个都过期就需要重新登录。完美契合了 缓存 过期时间。每次token对的生成都伴随缓存的token重置。当请求判定token 与缓存不一致就可以防止同时存在两个可用token的问题。而且还可以实现防止多端登录的业务需求。同时下线逻辑或者角色权限更改 都可以通过清除redis中的token来处理。

核心代码清单:

  • SecureUser 自定义spring security userDetails 用来携带定制 的用户信息
  • KeyPairFactory 解析RSA 钥匙对 用来jwt 加解密
  • JwtTokenStorage 对jwt进行储存。通过spring cache 实现 JwtTokenCacheStorage
  • JwtPairBuilder token对生成器
  • JwtAuthenticationFilter jwt token验证过滤器 用来验证请求中的jwt access_token
  • RefreshJwtTokenFilter 刷新token过滤器 处理刷新token 逻辑
  • CustomUsernamePasswordAuthenticationFilter 自定义登录器处理登录参数问题。
  • MultiWebSecurityConfig spring security 安全配置 结合jwt

参考上面代码清单可以看我给的demo, 生产可用 有些地方按照你需要的业务实现

代码地址:gitee.com/felord/dax-backend.git

有什么疑问可留言,不行了扛不住了。

文章来源:智云一二三科技

文章标题:JWT在开发中的实战操作(附带生产级别代码)

文章地址:https://www.zhihuclub.com/79975.shtml

关于作者: 智云科技

热门文章

网站地图