当前位置: 首页 > 知识库问答 >
问题:

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

茅秦斩
2023-03-14

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

共有3个答案

黎浩然
2023-03-14

在@RonOhRob的同一行中,我建议使用<code>jti</code>(JWT ID)声明。该声明为JWT提供了唯一标识符。

您的JWT有效载荷如下:

{
    "iss": "example.com",
    "iat": "1300819080",
    "exp": "1300819380",
    "jti": "123e4567-e89b-42d3-a456-556642440000",
    "username": "mneri"
}

当JWT手动过期时,将jti插入黑名单。该值应保留在表中,直到令牌自然到期。现在,对于每个请求,还应该检查表中是否存在<code>jti</code>;如果发现,访问将被拒绝。

如果用户想要使他的所有令牌过期,还有另一种涉及 iat(发行时间)声明的简单策略:将deny_before字段添加到用户表并注册expire_all API 调用的日期。和以前一样,您必须为每个请求添加检查。

要获得有关如何将JWT集成到Spring的完整参考,请查看JavaBrain的视频。视频中的家伙正在使用jjwt,但我建议使用aust0的java-jwt库,根据我的口味,它提供了更好的界面:

java prettyprint-override">JWT.create()
   .withJWTId(UUID.randomUUID().toString())
   .withIssuer(ISSUER)
   .withIssuedAt(issueDate)
   .withExpiresAt(expireDate)
   .withClaim("username", user.getUsername())
   .sign(Algorithm.HMAC256("secret"));

现在,在您的< code>JWTFilter中:

JWTVerifier verifier = JWT.require(ALGORITHM).withIssuer(ISSUER).build();
DecodedJWT decoded = verifier.verify(jwt);

if (blacklistService.find(jwt.getId())) {
    throw new JWTVerificationException();
}

User user = userService.loadByUsername(jwt.getClaim("username").asString());

if (user.getDenyBefore() != null && user.getDenyBefore().compareTo(jwt.getIssuedAt()) > 0) {
    throw new JWTValidationException();
}
慕河
2023-03-14

一个选项是只使用bannedUsers表。你甚至可以缓存这个表。如果用户帐户受到威胁,您可以将其添加到表中,直到其令牌过期。每次都会进行一次查找(除非缓存),但表上很可能总是有0条记录,所以速度会很快。

戚升
2023-03-14

你找不到任何方法来“终止”< code>JWT,因为没有这样的方法。我们可以说这是《JWT》的一个缺点。

如果令牌被泄露,那么这是一个大问题。如果需要使令牌/会话失效,则可能需要考虑其他身份验证机制。

使这种令牌“无效”的唯一方法是在后端使用其他< code>secret密钥——这显然是一个非常糟糕的主意!

但是,如果您正在寻找一种在前端“注销”用户的方法,只需从存储中清除JWT。(尽管如此,如果该用户复制了令牌,他将能够针对rest api执行请求)。

 类似资料:
  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 嗨,我正在创建使用 REST API endpoint与服务器端通信的移动本机应用程序。 我以前有开发本机客户端的经验,但我将简单的令牌(随机生成的字符串)存储在存储用户信息的同一表中的数据库中。所以它就像浏览器中使用的会话,但每个请求的标头中都有令牌,而不是 cookie。 最近我发现了JWT令牌。这似乎是保护私有endpoint的好方法。您可以从移动客户端请求令牌,前提是您通过登录并获得生成的

  • 对于身份验证,目前我们使用JWT,因此一旦创建了令牌,它就会在整个生命周期内创建,如果我们设置了时间过期,令牌将过期。 有没有办法使令牌过期? 单击注销按钮时,我需要销毁令牌。 我正在使用ASP. NET Core WebAPI。

  • 我在springboot中用jwt令牌开发了一个oauth2服务器,我在注销时遇到了困难http://www.baeldung.com/spring-security-oauth-revoke-tokens 注销后,如果在头中提供令牌并点击/user,则它将提供所有用户信息,而应该抛出并错误地表示用户已注销

  • 正如这里提到的http://projects.spring.io/spring-security-oauth/docs/oauth2.html,撤销是通过刷新令牌完成的。但这似乎不起作用。

  • 我们有一个带有Angular 2的Spring启动应用程序,对于身份验证,我们使用JWT。我遇到了一个问题——即使令牌已经过期,然后注销并再次登录,过期的JWT令牌仍然在请求标头上可用。因此后端仍然验证旧的JWT令牌,而不是新令牌。我需要清除浏览器缓存使其工作。 我看到令牌存储在Sessionstore中,下面的操作也是为了在上清除令牌 但这也不是清除旧令牌。我可以做些什么来从浏览器中清除令牌?