完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
JWT最大的一个优势在于它是无状态的,自身包含了认证鉴权所需要的所有信息,服务器端无需对其存储,从而给服务器减少了存储开销。
但是无状态引出的问题也是可想而知的,它无法作废未过期的JWT。举例说明注销场景下,就传统的cookie/session认证机制,只需要把存在服务器端的session删掉就OK了。但是JWT呢,它是不存在服务器端的啊,好的那我删存在客户端的JWT行了吧。额,社会本就复杂别再欺骗自己了好么,被你在客户端删掉的JWT还是可以通过服务器端认证的。 首先明确一点JWT失效的唯一途径就是等过期,就是说不借助外力的情况下,无法达到某些场景下需要主动使JWT失效的目的。而外力则是在服务器端存储着JWT的状态,在请求资源时添加判断逻辑,这与JWT特性无状态是相互矛盾的存在。但是,你要知道如果你选择走上了JWT这条路,那就没得选了。如果你有好的方式,希望你来打我脸。 以下就JWT在某些场景需要失效的简单方案整理如下:
白名单和黑名单的实现逻辑差不多,黑名单不需每次登录都将JWT缓存,仅仅在某些特殊场景下需要缓存JWT,给服务器带来的压力要远远小于白名单的方式。 三. 黑名单方式实现 以下演示在退出登录时通过添加至黑名单的方式实现JWT失效 逻辑很明确,在调用退出登录接口时将JWT缓存到Redis的黑名单中,然后在网关做判定请求头的JWT是否在黑名单内做对应的处理。
@Api(tags = "认证中心") @RestController @RequestMapping("/oauth") @AllArgsConstructor public class AuthController { private RedisTemplate redisTemplate;@DeleteMapping("/logout")public Result logout(HttpServletRequest request) { String payload = request.getHeader(AuthConstants.JWT_PAYLOAD_KEY); JSONObject jsonObject = JSONUtil.parseObj(payload); String jti = jsonObject.getStr("jti"); // JWT唯一标识 long exp = jsonObject.getLong("exp"); // JWT过期时间戳(单位:秒) long currentTimeSeconds = System.currentTimeMillis() / 1000; if (exp < currentTimeSeconds) { // token已过期 return Result.custom(ResultCode.INVALID_TOKEN_OR_EXPIRED); } redisTemplate.opsForValue().set(AuthConstants.TOKEN_BLACKLIST_PREFIX + jti, null, (exp - currentTimeSeconds), TimeUnit.SECONDS); return Result.success();}}
http://localhost:9999/youlai-admin/users/me
http://localhost:9999/youlai-admin/users/me 退出成功查看redis缓存黑名单列表 再次访问登录用户信息如下: 可以看到退出登录后再次使用原JWT请求提示“token无效或已过期”
打开之前搭建好的前端管理平台youlai-mall-admin-web,修改src/util/request.js文件中的无效token的响应码为“A0230”,这样在token无效的情况下提示重新登录 演示通过第三方接口调试工具调用注销接口让JWT失效,然后再次刷新页面请求资源会因为JWT的失效而跳转到登录页。 四. 总结 JWT是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式应用的统一认证鉴权。但是事物往往具有两面性,有利必有弊,因为JWT的无状态,自生成后不借助外界条件唯一失效的方式就是过期。然而借助的外界的条件后JWT便有状态了的,也就是没有所谓严格意义上的无状态,其实也不必纠结于此,因为瑕不掩瑜。在白名单和黑名单的实现方式,这里选择了后者状态性更小的黑名单方式。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
“0元购”智元灵犀X1机器人,软硬件全套图纸和代码全公开!资料免费下载!
2841 浏览 2 评论
1383 浏览 0 评论
【实操文档】在智能硬件的大模型语音交互流程中接入RAG知识库
6583 浏览 1 评论
防止AI大模型被黑客病毒入侵控制(原创)聆思大模型AI开发套件评测4
1077 浏览 0 评论
不可错过!人工神经网络算法、PID算法、Python人工智能学习等资料包分享(附源代码)
3395 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 00:27 , Processed in 0.372568 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号