Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spring Boot REST API中注销时使JWT令牌过期_Rest_Spring Boot_Jwt - Fatal编程技术网

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

在Spring Boot REST API中注销时使JWT令牌过期,rest,spring-boot,jwt,Rest,Spring Boot,Jwt,当用户单击注销按钮时,如何使JWT令牌无效?我做了一些研究,但没有找到任何好的实现。您无法找到任何“过期”JWT的方法,因为没有这种方法。我们可以说这是JWT的一个缺点 如果令牌被破坏,那么这将是一个巨大的问题。如果您需要使令牌/会话无效,您可能需要考虑其他的Auth机制。 要使这样一个令牌“失效”,唯一的方法就是在后端使用另一个secret密钥——这显然是一个非常可怕的想法 但是,如果您正在寻找一种在前端“注销”用户的方法,只需从存储中清除JWT即可。(尽管如此,如果该用户复制了令牌,他将能够

当用户单击注销按钮时,如何使JWT令牌无效?我做了一些研究,但没有找到任何好的实现。

您无法找到任何“过期”JWT的方法,因为没有这种方法。我们可以说这是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等等。你需要阅读每一篇文章,然后,在收集了一些知识之后,做出决定。这个答案是错误的。有很多方法,它们非常简单,请检查我的答案。好吧,这不会使令牌本身无效。这是黑名单。这是另一回事。当然,在某些情况下,它可能是一种解决方案,但这本身并不是无效。