当用户单击注销时,如何使JWT令牌无效。我已经在网上进行搜索,但找不到任何好的实现。请帮助实现相同的功能。
答案 0 :(得分:2)
您找不到任何“过期” JWT
的方法,因为没有这样的方法。我们可以说这是JWT
的缺点。
如果token
被盗用,那就是一个大问题。如果需要使令牌/会话无效,则可能需要考虑其他身份验证机制。
使令牌无效的唯一方法是在后端使用其他secret
键-这显然是一个非常可怕的想法!
但是,如果您正在寻找一种方法来“注销”前端的用户,只需从存储中清除JWT。 (不过,如果该用户复制了令牌,他将能够针对rest api执行请求。)
答案 1 :(得分:0)
一种选择是只具有bannedUsers表。您甚至可以缓存该表。如果用户帐户遭到破坏,则可以将其添加到表中,直到其令牌过期为止。每次都会进行查找(除非进行缓存),但是表上很可能总是有0条记录,因此非常快。
答案 2 :(得分:0)
与@RonOhRob在同一行上,我建议提出jti
(JWT ID)声明。该声明为JWT提供了唯一的标识符。
您的JWT有效负载如下:
{
"iss": "example.com",
"iat": "1300819080",
"exp": "1300819380",
"jti": "123e4567-e89b-42d3-a456-556642440000",
"username": "mneri"
}
当JWT手动过期时,您将jti
插入黑名单。该值应保留在表中,直到令牌自然到期为止。现在,对于每个请求,还应该检查表中是否jti
;如果发现访问被拒绝。
如果用户想使他的所有令牌都失效,则还有一个涉及iat
(Issued At)声明的简单策略:在deny_before
表中添加user
字段并注册{{ 1}} API调用。和以前一样,您必须为每个请求添加支票。
有关如何将JWT集成到Spring中的完整参考,请参见JavaBrain's video。
视频中的那个人正在使用expire_all
,但是我建议使用auth0's java-jwt库,以我的口味可以提供更好的界面:
jjwt
现在,在您的JWT.create()
.withJWTId(UUID.randomUUID().toString())
.withIssuer(ISSUER)
.withIssuedAt(issueDate)
.withExpiresAt(expireDate)
.withClaim("username", user.getUsername())
.sign(Algorithm.HMAC256("secret"));
内:
JWTFilter