【问题标题】:What format is the exp (Expiration Time) claim in a JWTJWT 中的 exp(过期时间)声明是什么格式
【发布时间】:2017-02-16 23:25:38
【问题描述】:

我正在使用 ADAL 库来获取资源的访问令牌。有谁知道过期时间的格式是什么?进一步来说 "exp" (Expiration time) claim.

JwtSecurityToken 类在解析后简单地返回 int32。所以,这不是一个好的指标。

尝试将其解析为 TimeSpanDateTime,但这些值的间隔不是 90 分钟。几乎一样。

这是我从提琴手那里得到的 iatexp 声明(使用 https://jwt.io/ 解析令牌)

iat: 1475874457

exp: 1475878357

值相差不大。

【问题讨论】:

  • 1475878357 - 1475874457 = 3900 sec, 3900 sec / 60 sec = 65 min(1 小时令牌生命周期 + 5 分钟时钟偏差)
  • 你用的是什么平台?
  • 在 Windows 上使用 .NET
  • 新日期(expires_at * 1000)
  • 我打算对 .NET 选择使用 int32 值作为 UNIX 时间戳(2038 每秒接近一次!)发表贬低评论,但看起来问题在 @ 上的报告不准确987654333@上课。它返回 DateTime 而不是 int32。你从哪里得到int32 的东西?

标签: jwt azure-active-directory adal


【解决方案1】:

RFC 7519 规定 expiat 声明值必须是 NumericDate 值。

NumericDateSection 2. Terminology 中的最后一个定义,定义为自 Epoch 以来的秒数不是毫秒):

一个 JSON 数值,表示从 1970-01-01T00:00:00Z UTC 直到指定的 UTC 日期/时间, 忽略闰秒。这相当于 IEEE Std 1003.1, 2013 版 [POSIX.1] 定义“自纪元以来的秒数”,在 每天正好占 86400 秒,其他 而不是可以表示非整数值。参见 RFC 3339 [RFC3339] 有关一般日期/时间和 UTC 的详细信息 特别的。

【讨论】:

  • 我正在寻找 JWT 令牌 exp 派生自哪种格式(我知道它是 EPOCH,但以秒或毫秒为单位),这回答了我的问题。
  • 可以像这样转换为 Javascript DateTime:new Date(exp_in_seconds * 1000)(其中 Javascript 需要自纪元以来的毫秒数;Unix timestamp
  • @TheRedPea 我认为您的评论可能具有误导性,因为“;Unix 时间戳”部分。 Unix 时间戳指定 的数量。 JSON Web Token 使用 的数量。 JavaScript Date 使用 毫秒 的数量。
  • 谢谢@Vincent,你是对的,这就是我乘以 1000 的原因。我的帖子仍然暗示它们是同一个单位;正如您所指出的,它们是不同的单位(JWT 时间戳以 为单位,但 Javascript 日期需要 毫秒);但是 JWT 和 Javascript Date 构造函数都使用 “自纪元以来”的想法
  • 这篇博文给出了一个简单的解决方案,它创建了一个扩展方法来处理这个问题。 kmatyaszek.github.io/2018/09/07/…
【解决方案2】:

Les 提供了正确的答案。如果您想快速将 NumericDate 转换为日期,可以使用以下 PowerShell 命令:

$numericDate = '1636027948'
([DateTime]('1970,1,1')).AddSeconds($numericDate)

输出:

Thursday, 4 November 2021 12:12:28

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2021-04-27
    • 1970-01-01
    • 2021-11-30
    • 2017-10-07
    • 2016-01-10
    相关资源
    最近更新 更多