JWT中的exp(过期时间)声明是什么格式?

170

我正在使用 ADAL 库获取一个资源的访问令牌。有人知道过期时间的格式吗?更具体地说,是 "exp" (Expiration time) claim 的格式。

JwtSecurityToken 类只是在解析后返回了 int32,因此这不是一个好的指示器。

尝试将其解析为 TimeSpanDateTime,但值之间相差 90 分钟,而实际上它们几乎相同。

以下是用 https://jwt.io/ 解析令牌后从 fiddler 中获得的 iatexp claim:

iat: 1475874457

exp: 1475878357

这些值之间并没有那么大的差异。


21
1475878357 - 1475874457 = 3900秒3900秒 / 60秒 = 65分钟 (1小时令牌生命周期 + 5分钟的时钟偏差)。 - Philippe Signoret
1
你使用的是哪个平台? - Philippe Signoret
在Windows上使用.NET - Frank Q.
6
新日期(expires_at * 1000) - Fredrik Johansson
我本来想对 .NET 选择在 UNIX 时间戳中使用 int32 值(2038 年每秒都会接近!)发表贬低的评论,但看起来这个问题没有准确地报告 JwtSecurityToken 类。它返回的是 DateTime 而不是 int32。你从哪里得到了这个 int32 的信息? - Christopher Schultz
2个回答

224

RFC 7519指出expnbfiat声明值必须是NumericDate值。

NumericDate第2节术语中的最后一个定义,它被定义为自Epoch以来的秒数(而不是毫秒):

一个JSON数值,表示从1970年01月01日00:00:00Z UTC到指定的UTC日期/时间的秒数,忽略闰秒。这相当于IEEE Std 1003.1,2013版[POSIX.1]定义的“时代秒”,其中每天由恰好86400秒计算,除了可以表示非整数值之外。有关日期/时间和UTC的详细信息,请参见RFC 3339 [RFC3339]。

2
我在寻找JWT令牌的过期时间是哪种格式(我知道它是EPOCH,但是以秒或毫秒为单位),这个答案解决了我的问题。 - jet_choong
41
可以这样将其转换为JavaScript的日期时间格式:new Date(exp_in_seconds * 1000)(其中JavaScript需要自纪元以来的毫秒数;即 Unix 时间戳)。 - Nate Anderson
2
@TheRedPea 我认为你的评论可能会有误导性,因为它包含了“; a Unix timestamp”这一部分。Unix时间戳指定了秒数。JSON Web Token使用秒数。JavaScript日期使用毫秒数 - Vincent
1
谢谢@Vincent,你说得对,这就是为什么我要乘以1000。尽管如此,我的帖子暗示它们是相同的单位;正如你所指出的那样,它们是不同的单位(JWT时间戳以秒为单位,但JavaScript日期需要毫秒);但是JWT和JavaScript日期构造函数都使用了“自纪元以来”的概念。 - Nate Anderson
这篇博客文章提供了一个简单的解决方案,它创建了一个扩展方法来处理此问题。 https://kmatyaszek.github.io/2018/09/07/jwt-exp-convert-datetime-to-unix-timestamp.html - AbhiAbzs
1
你错过了一个:NBF - 在此之前不可用 - 它必须以数字日期格式提供。 - LHA

11

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

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

输出:

Thursday, 4 November 2021 12:12:28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接