在Spring Boot REST API中注销时使JWT令牌过期
当用户单击注销按钮时,如何使JWT令牌无效?我做了一些研究,但没有找到任何好的实现。您无法找到任何“过期”JWT的方法,因为没有这种方法。我们可以说这是JWT的一个缺点 如果在Spring Boot REST API中注销时使JWT令牌过期,rest,spring-boot,jwt,Rest,Spring Boot,Jwt,当用户单击注销按钮时,如何使JWT令牌无效?我做了一些研究,但没有找到任何好的实现。您无法找到任何“过期”JWT的方法,因为没有这种方法。我们可以说这是JWT的一个缺点 如果令牌被破坏,那么这将是一个巨大的问题。如果您需要使令牌/会话无效,您可能需要考虑其他的Auth机制。 要使这样一个令牌“失效”,唯一的方法就是在后端使用另一个secret密钥——这显然是一个非常可怕的想法 但是,如果您正在寻找一种在前端“注销”用户的方法,只需从存储中清除JWT即可。(尽管如此,如果该用户复制了令牌,他将能够
令牌
被破坏,那么这将是一个巨大的问题。如果您需要使令牌/会话无效,您可能需要考虑其他的Auth机制。
要使这样一个令牌“失效”,唯一的方法就是在后端使用另一个secret
密钥——这显然是一个非常可怕的想法
但是,如果您正在寻找一种在前端“注销”用户的方法,只需从存储中清除JWT即可。(尽管如此,如果该用户复制了令牌,他将能够针对RESTAPI执行请求)。一个选项是只拥有一个bannedUsers表。您甚至可以缓存此表。如果用户帐户遭到破坏,您可以将其添加到表中,直到其令牌过期。每次都会进行查找(除非缓存),但表上很可能总是有0条记录,因此速度非常快。在@RonOhRob的同一行,我建议声明。该声明为JWT提供了唯一标识符 您的JWT有效负载将如下所示:
{
“iss”:“example.com”,
“iat”:“1300819080”,
“exp”:“1300819380”,
“jti”:“123e4567-e89b-42d3-a456-556642440000”,
“用户名”:“mneri”
}
当JWT手动过期时,将jti
插入黑名单。该值应保留在表中,直到令牌自然过期。现在,对于每个请求,还应该检查表中是否有jti
;如果找到,访问将被拒绝
如果用户希望使其所有代币过期,则有另一个简单的策略涉及到声明:在user
表中添加deny\u before
字段,并注册expire\u all
API调用的日期。与前面一样,您必须在每个请求中添加一个检查
有关如何将JWT集成到Spring中的完整参考,请参阅。
视频中的那个家伙正在使用jjwt,但我建议使用library,根据我的口味,它提供了更好的界面:
JWT.create()
.withJWTId(UUID.randomUUID().toString())
.与发行人(发行人)
.已发布日期(已发布日期)
.到期日(到期日)
.withClaim(“用户名”,user.getUsername())
.sign(Algorithm.HMAC256(“secret”);
现在,在JWTFilter
中:
JWTVerifier-verifier=JWT.require(算法).withIssuer(ISSUER.build();
DecodedJWT decoded=验证器验证(jwt);
if(blacklistService.find(jwt.getId())){
抛出新的JWTVerificationException();
}
User User=userService.loadByUsername(jwt.getClaim(“username”).asString());
if(user.getDenyBefore()!=null&&user.getDenyBefore().compareTo(jwt.getIssuedAt())>0){
抛出新的JWTValidationException();
}
您能否建议使用spring boot rest api实现任何好的身份验证机制,该机制将允许无效和刷新令牌属性。这是一个非常广泛的主题,需要根据需求进行讨论/考虑。有许多机制,每种机制都有其优缺点。会话、基本身份验证、OAuth、JWT等等。你需要阅读每一篇文章,然后,在收集了一些知识之后,做出决定。这个答案是错误的。有很多方法,它们非常简单,请检查我的答案。好吧,这不会使令牌本身无效。这是黑名单。这是另一回事。当然,在某些情况下,它可能是一种解决方案,但这本身并不是无效。