【问题标题】:Invalidating JWTs on sign out?注销时使 JWT 无效?
【发布时间】:2018-06-17 08:21:15
【问题描述】:

我是 JWT 的新手,想知道当用户退出应用程序时是否可以在服务器端使 JWT 无效/无效(我也想知道它是否有意义 em> 这样做!)。想法是:

  1. 用户在其应用中点击退出链接
  2. 应用调用POST https://api.myapp.example.com/auth/invalidate
  3. JWT(它是 HTTP 请求标头中的授权/承载令牌)以某种方式失效
  4. 现在,没有人可以再次使用该 JWT

我不确定这是否是一种非正统的注销逻辑方法,或者即使在用户注销之后,让 JWT 仍然有效是否可以接受(我想我可以缩短 JWT 的寿命到期,例如,60 分钟或其他时间)。

再说一遍:想知道是否有可能使用(如果可以,如何?!)进行这种“无效”,以及它是否有意义这样做(如果没有,典型的注销流程是什么样的?!)。谢谢!

【问题讨论】:

  • 您只需指出使用 JWT 进行登录身份验证 (IMO) 的缺陷之一。令牌本身包含过期时间,如果不创建全新的令牌,您实际上无法修改其过期时间。您可以为服务器添加一个辅助系统,以便能够在特定条件下拒绝令牌,但这会退回到传统的登录系统,您会失去访问令牌的可移植性。您可以简单地从客户端删除令牌,但您不能确定用户没有保留它并在注销后再次尝试使用它..

标签: security authentication jwt


【解决方案1】:

除了令牌到期日期(在exp 声明中说明)之外,我还可以想到几种使 JWT 令牌失效的方法:

更改密钥

第一种方法需要更改用于在服务器端签署令牌的密钥,但对于您问题中描述的情况似乎并不实用。

将令牌标识符列入白名单

另一种方法(可能是更适合您的方法)涉及在服务器端的白名单中跟踪令牌。

  • 发行令牌时,使用jti 声明在令牌中存储唯一标识符。还要将此唯一标识符添加到服务器端的白名单中。

  • 在验证令牌时(除了检查签名、到期日期和您可能需要的其他声明之外),请确保将 jti 声明的值列入白名单。

  • 当用户请求使令牌失效时,将令牌标识符从白名单中移除。

对于令牌标识符,您可以使用UUIDs。

JWT 允许您执行无状态身份验证(一旦您验证了签名,您就可以信任令牌,然后执行身份验证而不依赖于外部实体)。白名单方法是一种权衡,以防您需要跟踪已发行的代币。

【讨论】:

  • 谢谢@Cassio (+1) 我想我喜欢你的白名单/令牌 ID 方法。如果您不介意我问两个快速的后续问题:(1) 在上面,您声明“虽然不是真正的无状态”,就好像使用此解决方案要么创建有问题或违反某些原则。你介意稍微详细说明一下吗?含义:为什么 JWT 是“有状态的”是“坏的”? (2) 我假设对于白名单,我可以使用我想要的任何东西:MySQL DB 表等。是吗?再次感谢!
  • @smeeb (1) 我的声明应该是“虽然这不是真正的无状态身份验证。 JWT 的一大优势是它是一个自包含的令牌,允许您执行 无状态身份验证。也就是说,一旦您验证了签名,您就可以信任令牌并执行身份验证,而无需依赖外部实体。但是,如果您需要使特定令牌无效,您应该跟踪它(例如使用白名单方法)。
  • @smeeb (2) 对于白名单,您可以使用最适合您的:SQL 或 NoSQL 数据库。您可能还希望将过期日期与令牌标识符一起存储,以便您可以删除已过期令牌的标识符。
猜你喜欢
  • 2014-03-19
  • 2017-11-09
  • 2019-09-24
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2018-12-10
  • 2020-10-20
  • 2018-07-29
相关资源
最近更新 更多