验证 JWT 的“iat”和“sub”声明的依据是什么?

awa*_*r99 1 authentication node.js express jwt

我正在 Node.js 和 Express 中编写 SSO 身份验证服务器,使用 JWT 进行身份验证。我一直在阅读 Auth0 等来源的文章,了解如何更好地保护我的 JWT。我已经能够包含并验证令牌上的大多数标准声明,但我想知道究竟要验证什么“iat”和“sub”声明。

对于“iat”,当令牌传递到 Express 路由并且该路由在执行任何敏感操作之前开始检查用户的身份验证状态时,提供值来验证此声明的最佳实践是什么?我最好的猜测是在验证签名之前从令牌中提取 userId,然后将其与存储在用户表中的“iat”值进行比较,但这似乎不对。

对于“sub”,使用无状态服务器,如果应用程序从经过验证的令牌本身获取其用户信息,那么应用程序应该如何知道期望并验证哪个用户的“sub”声明?

或者我对这些用例的理解不正确?该服务器的目的是为此应用程序本身以及其他应用程序内的内容提​​供身份验证。

Ale*_*lex 6

为了使 JWT 正常工作,使用应用程序必须能够信任 SSO/JWT 发布服务器。当发布服务器生成令牌并且加密签名已被验证时,声明本质上是真实的。您仍然应该验证令牌中的所有输入以检查它们是否合理。

类似的声明iat是发行服务器记录其生成令牌的时间。假设这是一个有效的合理时间(不是 1970 年),那么发行服务器声明并签名的事实就可以被视为事实。

注意:在验证签名之前,应始终验证标头alg和值是否与发布服务器中的值匹配。typ

发出于

iat:标识 JWT 的发布时间。该值必须是数字日期。

可能的验证:

  • 是一个有效的正整数
  • 已是过去
  • 检查这个比上次安全事件更新的事件(快速撤销所有可能受损的令牌)

主题

sub:标识 JWT 的主题。(这是用户/名称/用户标识符)

可能的验证: - 它存在,不为空 - 用户在数据库中存在且未锁定等。(可选,取决于您的无国籍程度)