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

如何撤销JWT令牌?

戚奇略
2023-03-14

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

共有1个答案

公冶森
2023-03-14

一般来说,最简单的答案是不能撤消JWT令牌,但事实并非如此。诚实的回答是,支持JWT撤销的成本足够大,因为大多数时候都不值得,或者简单地重新考虑JWT的替代方案。

话虽如此,在某些场景中,您可能需要JWT和立即令牌吊销,所以让我们来介绍一下它将采取的措施,但首先我们将讨论一些概念。

JWT(Learn JSON Web Tokens)只指定了一种令牌格式,这个撤销问题也适用于通常称为自包含或按值令牌的任何格式。我喜欢后面的术语,因为它与引用标记形成了很好的对比。

使用同样的类比,理解由引用令牌的撤销是微不足道的;我们只需删除映射到该密钥的服务器端存储,下次提供该密钥时,它将无效。

对于按值令牌,我们只需要实现相反的内容。当您请求撤销令牌时,您存储的内容允许您唯一地标识该令牌,以便下次接收时您可以额外地检查它是否已被撤销。如果您已经认为这样的东西不能伸缩,请记住,您只需要存储数据直到令牌过期,并且在大多数情况下,您可能只存储令牌的哈希值,以便它始终是已知大小的东西。

最后要注意的是,在OAuth2.0中,按值访问令牌的撤销目前还不是标准化的。尽管如此,OAuth2.0令牌吊销特别指出,只要授权服务器和资源服务器都同意自定义的处理方式,它仍然可以实现:

如果您同时控制授权服务器和资源服务器,这是非常容易实现的。另一方面,如果将授权服务器角色委托给Auth0之类的云提供商或Spring OAuth2.0之类的第三方组件,则很可能需要采用不同的方法,因为您可能只得到已经标准化的内容。

有趣的参考资料

本文解释了另一种方法:黑名单JWT,它包含一些有趣的规则和模式,后面跟着RFC7523

 类似资料:
  • 我有短过期(5分钟)的访问令牌和刷新令牌。 如何立即撤销特定用户的访问令牌? 例如,如果我想禁止某个用户?我点击了禁止按钮,现在我想立即撤销他的访问令牌。我不想等待令牌到期。 我需要以某种方式创建令牌黑名单,但如果我不知道特定用户的访问令牌,如何将其添加到黑名单? 我应该将所有 jwt 令牌存储在数据库还是 redis 中?代码示例将非常有帮助。 非常感谢。

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

  • 当我想要注销时,我调用以下代码: 怎么修?

  • 我使用Keycloak来保护我的react前端和Node.js后端。这些客户端使用基于角色的授权进行保护。 我尝试这个endpoint来撤消用户访问令牌。但不起作用/auth/admin/realms//users/ 是否有方法在Keycloak中撤销特定用户的访问令牌?

  • 我正在使用Laravel Passport,并且在控制器中具有注销功能。见下文: 我现在试图为此编写一个单元测试,但是即使在注销和令牌被撤销后,用户仍然保持登录状态。我发现此方法照明\Auth\ResestGuard::注销不存在Laravel Passport,但即使此解决方案也不适用于我。我猜这可能是因为我正在使用Laravel 8。我的单元测试是这样的: 结果如下: 预期状态代码401,但收

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