实战!退出登录时何如借助外力使JWT令牌失效?


发布日期:2025-05-10 16:40    点击次数:143

[[442955]]

本文转载自微信公众号「码猿时期专栏」,作家在下陈某。转载本文请联系码猿时期专栏公众号。

今天这篇著作先容一下如安在修改密码、修改权限、刊出等场景下使JWT失效。

著作的目次如下:

贬责决策

JWT最大的一个上风在于它是无现象的,本身包含了认证鉴权所需要的通盘信息,管事器端无需对其存储,从而给管事器减少了存储支出。

但是无现象引出的问题亦然不言而喻的,它无法作废未过期的JWT。例如施展刊出场景下,就传统的cookie/session认证机制,只需要把存在管事器端的session删掉就OK了。

但是JWT呢,它是不存在管事器端的啊,好的那我删存在客户端的JWT行了吧。额,社会本就复杂别再愚弄我方了好么,被你在客户端删掉的JWT照旧不错通过管事器端认证的。

使用JWT要杰出明确的少量:JWT失效的唯独门道即是恭候时候过期。

迷水商城迷水商城

但是不错借助外力保存JWT的现象,这时就有东谈主问了:你这不是打脸吗?用JWT就因为它的无现象性,这时候又要保存它的现象?

其实否则,这不被不得不尔了吗?不使用外力保存JWT的现象,你说何如兑现刊出失效?

常用的决策有两种,白名单和黑名单相貌。

1、白名单

迷水商城迷水商城

白名单的逻辑很浅薄:认证通过期,将JWT存入redis中,刊出时,将JWT从redis中移出。这种相貌和cookie/session的相貌大同小异。

迷水商城

2、黑名单

黑名单的逻辑也杰出浅薄:刊出时,将JWT放入redis中,而且开荒过期时候为JWT的过期时候;请求资源时判断该JWT是否在redis中,要是存在则终止走访。

白名单和黑名单这两种决策王人相比好兑现,但是黑名单带给管事器的压力远远小于白名单,毕竟刊出不是平庸性操作。

黑名单相貌兑现

底下以黑名单的相貌先容一下如安在网关层面兑现JWT的刊出失效。

究竟向Redis中存储什么?

要是告成存储JWT令牌可行吗?虽然可行,不外JWT令牌然则很长的哦,这么对内存的条目亦然挺高的。

老到JWT令牌的王人知谈,JWT令牌中有一个jti字段,这个字段不错说是JWT令牌的唯独ID了,如下:

听话水

因此不错将这个jti字段存入redis中,动作唯独令牌象征,春药首选网店这么一来是不是从简了好多的内存?

何如兑现呢? 分为两步:

迷水商城迷水商城 网关层的全局过滤器中需要判断黑名单是否存在现时JWT 刊出接口中将JWT的jti字段动作key存放到redis中,且开荒了JWT的过期时候

1、网关层领悟JWT的jti、过期时候放入请求头中

在网关的全局过滤器GlobalAuthenticationFilter中告成从令牌中领悟出jti和过期时候。

迷水商城

这里的逻辑分为如下法子:

领悟JWT令牌的jti和过期时候

365站群VIP

凭据jti从redis中查询是否存在黑名单中,要是存在则告成抵制,否则放行

将领悟的jti和过期时候封装到JSON中,传递给卑鄙微管事

要道代码如下:

2、卑鄙微管事的过滤器修改

还谨记上篇著作:实战干货!Spring Cloud Gateway 整合 OAuth2.0 兑现散播式斡旋认证授权!中微管事的过滤器AuthenticationFilter吗?

迷水商城

AuthenticationFilter这个过滤工具来解密网关层传递的JSON数据,并将其封装到Request中,这么在业务措施中便不错随时获得到想要的用户信息。

这里我是把JWT有关的信息同期封装到了Request中,实体类为JwtInformation,如下:

LoginVal禁受了JwtInformation,如下:

迷水商城

此时AuthenticationFilter这个过滤器修改起来就很浅薄了,只需要将jti和过期时候封装到LoginVal中即可,要道代码如下:

逻辑很浅薄,上图王人有标注。

3、刊出接口兑现

之前著作中并莫得提供刊出接口,因为无现象的JWT根底不需要退出登录,傻等着过期呗。

虽然为了兑现刊出登录,借助了Redis,那么刊出接口必弗成少了。

逻辑很浅薄,告成将退出登录的JWT令牌的jti开荒到Redis中,过期时候开荒为JWT过期时候即可。代码如下:

迷水商城

OK了,至此照旧兑现了JWT刊出登录的功能.......

波及到的三个模块的改革,分袂如下:

迷水商城 称呼 功能 oauth2-cloud-auth-server OAuth2.0认证授权服 oauth2-cloud-gateway 网关管事 oauth2-cloud-auth-common 环球模块

记忆

想想很浅薄,JWT既然是无现象的,只可借助Redis记载它的现象,这么才智达到使其失效的看法。

测试

业务基本完成了,底下走一个历程测试一下,如下:

迷水商城

1、登录,央求令牌

2、拿着令牌走访接口

该令牌并莫得刊出,因此不错通俗走访,如下:

3、调用接口刊出登录

请求如下:

4、拿着刊出的令牌走访接口

由于令牌照旧刊出了,因此详情走访欠亨接口,复返如下: