【问题标题】:What to validate 'iat' and 'sub' claims of a JWT against?验证 JWT 的“iat”和“sub”声明的依据是什么?
【发布时间】:2020-07-18 20:11:49
【问题描述】:

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

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

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

还是我对这些用例的理解有误?此服务器的目的是为此应用本身以及其他应用内的内容提​​供身份验证。

【问题讨论】:

    标签: node.js express authentication jwt


    【解决方案1】:

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

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

    注意:在验证签名之前,应始终将标头 algtyp 值验证为与来自发行服务器的值匹配。

    发布于

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

    可能的验证:

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

    主题

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

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

    【讨论】:

    • 啊,谢谢你的详细解释,这更有意义。是的,我已经专门验证了algtyp 声明,其中包括audiss。我只是对这两个感到困惑
    猜你喜欢
    • 2022-01-04
    • 2017-09-11
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2018-02-08
    • 2020-11-24
    • 2019-09-01
    相关资源
    最近更新 更多