如何撤销 JWT 令牌?

2024-03-17

我正在使用 Spring Security OAuth2 和 JWT 令牌。我的问题是:如何撤销 JWT 令牌?

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


一般来说最简单的答案是你不能撤销 JWT 令牌,但这根本不是真的。诚实的答案是,支持 JWT 撤销的成本足够大,在大多数情况下不值得,或者直接重新考虑 JWT 的替代方案。

话虽如此,在某些情况下,您可能需要 JWT 和立即令牌撤销,因此让我们了解一下它需要做什么,但首先我们将介绍一些概念。

JWT (学习 JSON Web 令牌 https://auth0.com/learn/json-web-tokens/)仅指定令牌格式,此撤销问题也适用于通常称为自包含或按值令牌的任何格式。我喜欢后一个术语,因为它与引用标记形成了很好的对比。

按价值代币- 相关信息,包括令牌生命周期,包含在令牌本身中,并且可以验证该信息是否来自可信来源(数字签名来救援)

通过引用标记- 相关信息保存在服务器端存储中,然后使用令牌值作为密钥获取该信息;作为服务器端存储,相关信息是隐式信任的

在 JWT Big Bang 之前,我们已经在身份验证系统中处理过令牌;应用程序通常会在用户登录时创建一个会话标识符,然后使用该标识符,以便用户不必每次都重复登录过程。这些会话标识符被用作服务器端存储的关键索引,如果这听起来与您最近读到的内容类似,那么您是对的,这确实属于引用令牌。

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

对于按值代币,我们只需要实现相反的操作即可。当您请求撤销令牌时,您会存储一些内容来唯一地标识该令牌,以便下次收到它时您可以额外检查它是否被撤销。如果您已经认为这样的东西无法扩展,请记住您只需要存储数据直到令牌过期,并且在大多数情况下您可能只存储令牌的哈希值,这样它就总是是已知尺寸的东西。

最后一点,为了将其集中在 OAuth 2.0 上,按值访问令牌的撤销目前尚未标准化。尽管如此,OAuth 2.0 令牌撤销明确指出,只要授权服务器和资源服务器都同意处理此问题的自定义方式,它仍然可以实现:

在前一种情况下(自包含的令牌),当需要立即撤销访问令牌时,可以使用授权服务器和资源服务器之间的一些(当前非标准化的)后端交互。

如果您同时控制授权服务器和资源服务器,这很容易实现。另一方面,如果您将授权服务器角色委托给云提供商(如 Auth0)或第三方组件(如 Spring OAuth 2.0),您很可能需要以不同的方式处理事情,因为您可能只能得到已经标准化的内容。

一个有趣的参考

本文解释了另一种方法:黑名单智威汤逊 https://auth0.com/blog/denylist-json-web-token-api-keys/它包含一些有趣的实践和模式RFC7523 https://www.rfc-editor.org/rfc/rfc7523#section-2.1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何撤销 JWT 令牌? 的相关文章

随机推荐

  • 基于Cloud pub/sub队列自动扩展GCE实例组

    GCE 实例组可以根据 Google Cloud PubSub 队列计数或其他异步任务队列 例如 PSQ 扩大 缩小规模吗 Yes 该功能现在处于 alpha 阶段 https cloud google com compute docs a
  • 在块内循环以错误的顺序附加到数组 - Swift 2.0

    我从 Parse 下载了一个 PFFile 数组 我试图将它们转换为 NSData imageDataArray 数组 以便将它们保存到 Core Data 中 我现在遇到的唯一问题是 imageDataArray 的元素添加顺序错误 这意
  • Haskell 堆栈与全局 ghc

    是否可以使用stack已经安装了ghc没有stack安装本地副本ghc or cabal 是的 如果ghc in PATH是所选快照的正确版本 stack会很高兴地使用它 ghc version The Glorious Glasgow H
  • 用于验证管道分隔项目数量的正则表达式

    我有一个字符串 它是管道 划定的 我需要一个正则表达式来根据管道字符验证项目数量 因此 正则表达式将执行以下操作 如果最大项目数为三 asdfasdf asdfasdf asdfasdf 有效 asdfasdf asdfasdf asdfa
  • 如何让wxpython密码textctrl显示字符?

    使用 wxPython 可以将密码字段创建为 wx TextCtrl frm 1 style wx TE PASSWORD 我想知道是否有一种方法可以动态地将这个密码字段更改为普通的文本控件 以便用户可以看到密码是什么 创建控件后无法更改样
  • 在 ScrollView 中使用 RecyclerView 并具有灵活的 Recycler 项目高度

    我想知道是否有任何可能的方法可以使用回收视图 在此之前 我使用 RecyclerView固定高度里面一个滚动视图但这次我不知道该物品的高度 Hint 在问这个问题之前 我阅读了堆栈问题上的所有问题和解决方案 update 一些解决方案展示了
  • 使用 Mercurial,如何记录具有跨分支祖先的分支?

    在 Mercurial 中 我想构建所有提交消息的更改日志以进行修订stable分支 目前 我正在使用 hg log r
  • 使用 v4l2loopback 和 EDSDK Liveview 进行佳能 DSLR 视频环回?

    我想使用 DSLR 相机作为视频输入 例如在 Linux 和 Android 下进行 Skype Google talk 是否可以使用 v4l2loopback 和 Canon EDSDK 创建视频环回 如何将实时取景缓冲区从摄像机传输到视
  • 为什么 DataContractSerializer 不支持属性?

    我根据客户的文档创建 xsd 并且所有 xsd 都有属性 我一直在使用 xsd exe 从 xsd 生成类 但我读到 DataContractSerializer 不支持属性 为什么不 这是否意味着我只能有一个只有元素的soap xml 文
  • 关于 TypeScript 的 noUnusedParameters 编译器选项的说明

    在 GitHub 上输入任何内容之前 我试图确定这实际上是否是一个错误 With noUnusedParameters启用后 TypeScript 编译器会出现如下错误 const foo one two three foo forEach
  • 生日显示为去年的年龄?

    我正在测试一个我想在其中使用它的网站的 JavaScript 片段 基本上 当页面加载我的年龄时执行的函数 我是在规定的出生日期之外做这件事的 我在使用birthDate变量时注意到一个错误 不确定为什么会发生 当birthDate月份比当
  • Doctrine ORM 内存问题

    问题 运行使用下面 Factory 类中的 Doctrine 的守护程序服务时 会出现内存问题 当守护进程服务启动时 它运行大约 175MB 一天后大约是 250MB 再过一天就达到 400MB 我正在寻找导致内存增加的原因以及如何降低内存
  • 将java库包含到自己的库中

    我为自己创建了一个小框架 我想在多个项目中使用它 我还希望分布式 jar 文件包含所有外部库 以便我的项目只需要包含我的库即可访问所有外部库 我需要这个来简化外部库的更新 所以我把它放在我的 build xml 中 它将 dist lib
  • 如何使用加特林检查 If 方法?

    记录在案here https gatling io docs current cheat sheet 加特林checkIf方法用于条件检查 它不可用于ScenarioBuilder的流畅 API 但我可以在CheckSupport班级 我在
  • 如何将在线 CSV 数据插入 SQL Server 数据库?

    我需要每天从在线可用的 csv 执行数据加载 例如http www supplier com products csv http www supplier com products csv一旦我将 csv 转储到 sql 表中 我就可以进行
  • 如何枚举es6类方法[重复]

    这个问题在这里已经有答案了 如何枚举 ES6 类的方法 如同Object keys 这是一个例子 class Callbacks method1 method2 const callbacks new Callbacks callbacks
  • 为什么 &&、&、|| 的输出不同?

    这是代码段 你能解释一下为什么输出不同 1 public static ShortCkt public static void main String args int i 0 boolean t true boolean f false
  • 使用 Makefile 在编译中排除源文件

    是否可以使用 Makefile 中的通配符函数在编译过程中排除源文件 就像有几个源文件一样 src foo cpp src bar cpp src 然后在我的 makefile 中 SRC FILES wildcard src cpp 但我
  • 以编程方式滚动离子段

    有什么办法可以控制分段的滚动吗 在我的情况下 滑块和段相互依赖 当您滑动幻灯片时 溢出段不会滑动 但将正确选择活动段 我的视图和控制器代码
  • 如何撤销 JWT 令牌?

    我正在使用 Spring Security OAuth2 和 JWT 令牌 我的问题是 如何撤销 JWT 令牌 正如这里提到的http projects spring io spring security oauth docs oauth2