【问题标题】:What to store in a JWT?在 JWT 中存储什么?
【发布时间】:2016-12-18 06:15:29
【问题描述】:

你们如何在多个设备上处理同一个用户? {admin: true} 之类的数据除了更改它的设备之外不会变得陈旧吗?

这甚至应该在 JWT 中吗?如果没有,而我们只使用用户 ID,那会不会就像一个基于 cookie 的会话,因为我们将状态存储在服务器上?

【问题讨论】:

  • 列出一些我认为到目前为止有用的属性:userIDlastActivescopes 如果您有一个可以撤销所有用户密钥的黑名单功能,将会很有用

标签: session cookies jwt


【解决方案1】:

JWT RFC 建立了三类声明:

  • 已注册声明,例如 subissexpnbf

  • 公开声明具有公开名称或名称 registered by IANA,其中包含应唯一的值,例如 emailaddressphone_number。见full list

  • 私人声明在您自己的上下文中使用,价值观可能会发生冲突

这些声明都不是强制性的

JWT 是自包含的,应避免使用提供必要数据的服务器会话来执行身份验证(无需服务器存储和数据库访问)。因此,role info 可以包含在 JWT 中。

当使用多个设备时,有多种原因在到期前撤销令牌,例如当用户更改密码、权限或被管理员删除的帐户时。在这种情况下,您需要一个黑名单或替代机制来拒绝令牌

黑名单可以包括令牌唯一 ID jti 或在更新用户的关键数据(密码、权限等)和 currentTime - maxExpiryTime < last iss 后简单地设置一个条目 (sub - iss)。当currentTime - maxExpiryTime > last_modified 时可以丢弃该条目(不再发送未过期的令牌)。


注册索赔

以下声明名称已在 Section 10.1. 建立的 IANA“JSON Web 令牌声明”注册表中注册

  • iss(颁发者):标识颁发 JWT 的委托人。
  • sub(主题):标识作为 JWT 主题的主体。必须是唯一的
  • aud(受众):标识 JWT 的目标接收者(字符串数组/uri)
  • exp(过期时间):标识过期时间(UTC Unix),在此之后您必须不再接受此令牌。它应该在发布时间之后。
  • nbf(not before):标识 UTC Unix 时间,在该时间之前不能接受 JWT
  • iat(发布于):标识发布 JWT 的 UTC Unix 时间
  • jti(JWT ID):为 JWT 提供唯一标识符。

示例

{
    "iss": "stackoverflow",
    "sub": "joe",
    "aud": ["all"],
    "iat": 1300819370,
    "exp": 1300819380,
    "jti": "3F2504E0-4F89-11D3-9A0C-0305E82C3301"
    "context": {
        "user": {
            "key": "joe",
            "displayName": "Joe Smith"
        },
        "roles":["admin","finaluser"]
    }
}

在此处查看替代方案https://stackoverflow.com/a/37520125/6371459

【讨论】:

  • 我正在尝试扩展 #2:公开声明中的内容。我不认为emailaddress 是很好的例子,因为它们应该是可配置的并且没有将令牌列入黑名单,因此用户不必从另一台设备再次登录。但是,adminscopes 等属性将是您的黑名单方法的理想选择。我只是在寻找可以添加到令牌中的其他属性。
  • 另外,您必须记住它应该尽可能短,因为它主要用于网络上下文。
  • 查看此链接以获取声明的实际注册表iana.org/assignments/jwt/jwt.xhtml。要建立黑名单,您需要在 jti 中使用唯一的令牌 ID,或在 sub 中包含用户 ID。也可以使用 iss 来控制如何只撤销旧令牌
猜你喜欢
  • 2019-06-22
  • 2022-08-10
  • 2019-07-23
  • 1970-01-01
  • 2020-08-09
  • 2020-09-28
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多