比较jwt.iat(在处发出)属性与当前日期时间-(“自大纪元以来的第二个” NumericDate)

问题描述 投票:0回答:1

我正在从Web服务获取一个json Web令牌,该令牌在解码时会返回如下内容:

{
  "exp": 1572468916,
  "iat": 1572468316,
  "iss": "https://ccc/auth/realms/yyy",
  "aud": "xxx-api",
  [...]

根据Section 2 terminalogy,NumericDate数据类型对应于“自纪元以来的第二个事件”

所以我将其转换为如下所示的Javascript日期:

new Date(1572468316 * 1000)
Date Wed Oct 30 2019 17:45:16 GMT-0300 (Argentina Standard Time)

问题是我现在的时间是:

new Date()
Date Wed Oct 30 2019 14:45:19 GMT-0300 (Argentina Standard Time)

有效地,当前时间是从new Date()返回的时间(即14:45,否17:45)

我猜它与GMT有关,但我不知道如何处理。

我想将iat属性(显然也将exp属性也转换为当前时间,以便将其与new Date()进行比较,以了解令牌是否已经过期。

所以我如何将NumericDate从json网络令牌iat / exp属性转换为我的本地时间以进行比较?

javascript datetime jwt datetimeoffset gmt
1个回答
0
投票

iatexp值的确以Unix时代以来的秒数为单位。由于Unix时代是基于UTC的,因此这些值也是如此。您正在将它们正确转换为Date对象。

var iat = new Date(1572468316 * 1000);
var exp = new Date(1572468916 * 1000);

console.log(iat.toISOString()); //=> "2019-10-30T20:45:16.000Z"
console.log(exp.toISOString()); //=> "2019-10-30T20:55:16.000Z"

toISOString函数以ISO 8601格式发出一个字符串,以UTC表示(如结尾的Z字符所示。]

您在问题中给出的输出格式是在调用toString函数或在选择记录Date输出的环境中直接记录toString对象时会发生什么。由于不同的环境可以发出不同的格式(某些时间是本地时间,某些时间是UTC,有些则是ISO 8601,有些则采用非标准格式)-不建议直接记录Date对象。

toISOString的输出显示JWT有效期为10分钟,即从UTC 2019-10-30 20:45:16到UTC 2019-10-30 20:55:16。没有其他方法可以解释这些结果。

您的本地时间输出显示了三个小时的转换,这将正确地对应于UTC-3时区偏移,再次确认它们的值已正确解析。

如果不是您所期望的,则说明令牌发行不正确。正在进行两件事之一:

  • 生成JWT的代码中可能存在错误,因为它使用本地时间而不是UTC作为创建时间戳的基础。

  • 运行生成JWT的代码的服务器的时钟设置可能不正确。

第二个更合理。例如,当服务器管理员将时区设置为UTC但根据本地时间设置时钟时,可能会发生这种情况。相反,请确保将服务器上的时钟设置为自动从Internet同步其时间,并且问题可能会消失。

关于问题注释中提到的方法-不要这样做。以这种方式减去时区偏移不会正确调整时区,而是会选择其他时间点。它可能似乎提供了正确的结果,但是您会在许多时区中的夏令时过渡周围发现边缘情况,一旦开始使用正确的值生成JWT,就会遇到问题。

© www.soinside.com 2019 - 2024. All rights reserved.