在Spring Boot Rest API中注销时使JWT令牌过期

时间:2019-02-26 13:32:38

标签: rest spring-boot jwt

当用户单击注销时,如何使JWT令牌无效。我已经在网上进行搜索,但找不到任何好的实现。请帮助实现相同的功能。

3 个答案:

答案 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