无法为 JWT 正确设置 Exp 和 Iat
Unable to set Exp and Iat for JWT correctly
我有点被这个难住了。我正在尝试设置一个有效的 JWT。我将 node.js 与 jsonwebtoken 中间件一起使用。我已按照存储库 (located here) 上的文档进行操作,但我总是收到错误的 Exp 和 Iat。显然我想做对,这样我就不允许 JWT 过期了。
作为测试,我有以下代码:
var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: '1h' });
var decoded = jwt.decode(token, configGeneral.JWT);
var d1 = new Date(decoded.exp);
var d2 = new Date(decoded.iat);
console.log(decoded);
console.log(d1);
console.log(d2);
这个输出是:
{ id: '56253091fe0397c80133f3e4',
iat: 1445714161,
exp: 1445717761 }
Sat Jan 17 1970 19:35:17 GMT+0200 (South Africa Standard Time)
Sat Jan 17 1970 19:35:14 GMT+0200 (South Africa Standard Time)
如何让时间戳不反映 javascript 纪元,而是反映从现在起 1 小时后的时间? (对于 iat 和 exp。)
这个:
new Date().getTime()
以毫秒为单位给你时间。但是 jwt 令牌 (iat, exp) 中的时间以秒为单位,因此我们必须将结果除以 1000。
var actualTimeInSeconds = new Date().getTime()/1000;
如何从现在开始以秒计算时间:
(new Date().getTime() + someTimeInSeconds * 1000)/1000
如果您需要 1 小时后:
(new Date().getTime() + 60 * 60 * 1000)/1000
因为 1 小时 = 60 分钟 * 60 秒
此时你有来自 jwt 令牌的时间(以秒为单位)和计算时间(以秒为单位)。您应该只比较这个值。
正是在您的情况下,您应该将 jwt 令牌时间与您的实际时间(以秒为单位)进行比较。如果 jwt 令牌过期时间大于实际时间,则表示它仍然有效。
来自 jwt 令牌的文档:
The processing of the exp claim requires that the current date/time MUST be before the expiration date/time listed in the exp claim.
编辑:
要从 iat 中获取正确的日期,请将值乘以 1000 并添加到新的 Date 构造函数中:
new Date(iat*1000)
根据 Krzysztof Sztompka 发布的内容,我可以让 Ext 显示正确的到期日期。 (我原来的要求是以后1小时)
为了跟踪更改与之前的错误,我不会更新上面的代码,所以这里是我更改的内容:
var d = new Date();
var calculatedExpiresIn = (((d.getTime()) + (60 * 60 * 1000)) - (d.getTime() - d.getMilliseconds()) / 1000);
var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: calculatedExpiresIn });
console.log 现在将显示 Ext 是我想要的,现在 + 1 小时。
为了让 Iat 显示正确的日期(在 sign
函数中设置它然后在 decode
函数中对其进行完整性检查),我必须将它设置为有效载荷。我得到了答案 here
所以最后为了让 Iat 正确显示,我将它添加到负载中,如下所示:
var token = jwt.sign({"id": user._id, "iat": (new Date().getTime())}, configGeneral.JWT, { expiresIn: calculatedExpiresIn });
这给出了输出:
{ id: '56253091fe0397c80133f3e4',
iat: 1445763099706,
exp: 1445766699705 }
Sun Oct 25 2015 11:51:39 GMT+0200 (South Africa Standard Time)
Sun Oct 25 2015 10:51:39 GMT+0200 (South Africa Standard Time)
这是未编码的 JWT,我将在用户成功登录后将其传回给用户,并允许我检查他们必须通过的 JWT 是否仍然有效且尚未过期.
库创建的纪元是 Unix 纪元时间&你可以在任何网站上检查 jwt iat 和 exp 值 (like this for example)&你会发现它们有效
比如你问题1445714161中的iat是
格林威治标准时间:2015 年 10 月 24 日星期六 19:16:01
您的 exp 是 1445717761,格林威治标准时间:2015 年 10 月 24 日,星期六 20:16:01
所以一小时后就是你的objective从一开始
如果你尝试 javascript new Date(1445714161) 你会得到一个错误的时间
因此,根据 jsonwebtoken 库的文档创建 iat(自动创建)和 exp 声明的最简单方法 here
您可以通过这种方式轻松设置到期时间
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 });
甚至更好:
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: '1h' });
这会将 exp 声明放入 jwt 中,如下所示,并为 iat 和 exp 提供正确的 unix 纪元时间(到期时间比发布时间晚 1 小时),例如它会像这样(可以在 jwt 库中轻松验证):
{
"data": "foobar",
"iat": 1539549664,
"exp": 1539553264
}
请注意,上述 expiresIn
选项特定于 jsonwebtoken 库,更通用的方式如下:
jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, 'secret');
通过将 *1000
添加到 exp
和 iat
,您将看到正确的日期。
var d1 = new Date(decoded.exp*1000);
var d2 = new Date(decoded.iat*1000);
我有点被这个难住了。我正在尝试设置一个有效的 JWT。我将 node.js 与 jsonwebtoken 中间件一起使用。我已按照存储库 (located here) 上的文档进行操作,但我总是收到错误的 Exp 和 Iat。显然我想做对,这样我就不允许 JWT 过期了。
作为测试,我有以下代码:
var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: '1h' });
var decoded = jwt.decode(token, configGeneral.JWT);
var d1 = new Date(decoded.exp);
var d2 = new Date(decoded.iat);
console.log(decoded);
console.log(d1);
console.log(d2);
这个输出是:
{ id: '56253091fe0397c80133f3e4',
iat: 1445714161,
exp: 1445717761 }
Sat Jan 17 1970 19:35:17 GMT+0200 (South Africa Standard Time)
Sat Jan 17 1970 19:35:14 GMT+0200 (South Africa Standard Time)
如何让时间戳不反映 javascript 纪元,而是反映从现在起 1 小时后的时间? (对于 iat 和 exp。)
这个:
new Date().getTime()
以毫秒为单位给你时间。但是 jwt 令牌 (iat, exp) 中的时间以秒为单位,因此我们必须将结果除以 1000。
var actualTimeInSeconds = new Date().getTime()/1000;
如何从现在开始以秒计算时间:
(new Date().getTime() + someTimeInSeconds * 1000)/1000
如果您需要 1 小时后:
(new Date().getTime() + 60 * 60 * 1000)/1000
因为 1 小时 = 60 分钟 * 60 秒
此时你有来自 jwt 令牌的时间(以秒为单位)和计算时间(以秒为单位)。您应该只比较这个值。
正是在您的情况下,您应该将 jwt 令牌时间与您的实际时间(以秒为单位)进行比较。如果 jwt 令牌过期时间大于实际时间,则表示它仍然有效。 来自 jwt 令牌的文档:
The processing of the exp claim requires that the current date/time MUST be before the expiration date/time listed in the exp claim.
编辑:
要从 iat 中获取正确的日期,请将值乘以 1000 并添加到新的 Date 构造函数中:
new Date(iat*1000)
根据 Krzysztof Sztompka 发布的内容,我可以让 Ext 显示正确的到期日期。 (我原来的要求是以后1小时)
为了跟踪更改与之前的错误,我不会更新上面的代码,所以这里是我更改的内容:
var d = new Date();
var calculatedExpiresIn = (((d.getTime()) + (60 * 60 * 1000)) - (d.getTime() - d.getMilliseconds()) / 1000);
var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: calculatedExpiresIn });
console.log 现在将显示 Ext 是我想要的,现在 + 1 小时。
为了让 Iat 显示正确的日期(在 sign
函数中设置它然后在 decode
函数中对其进行完整性检查),我必须将它设置为有效载荷。我得到了答案 here
所以最后为了让 Iat 正确显示,我将它添加到负载中,如下所示:
var token = jwt.sign({"id": user._id, "iat": (new Date().getTime())}, configGeneral.JWT, { expiresIn: calculatedExpiresIn });
这给出了输出:
{ id: '56253091fe0397c80133f3e4',
iat: 1445763099706,
exp: 1445766699705 }
Sun Oct 25 2015 11:51:39 GMT+0200 (South Africa Standard Time)
Sun Oct 25 2015 10:51:39 GMT+0200 (South Africa Standard Time)
这是未编码的 JWT,我将在用户成功登录后将其传回给用户,并允许我检查他们必须通过的 JWT 是否仍然有效且尚未过期.
库创建的纪元是 Unix 纪元时间&你可以在任何网站上检查 jwt iat 和 exp 值 (like this for example)&你会发现它们有效
比如你问题1445714161中的iat是 格林威治标准时间:2015 年 10 月 24 日星期六 19:16:01
您的 exp 是 1445717761,格林威治标准时间:2015 年 10 月 24 日,星期六 20:16:01
所以一小时后就是你的objective从一开始
如果你尝试 javascript new Date(1445714161) 你会得到一个错误的时间
因此,根据 jsonwebtoken 库的文档创建 iat(自动创建)和 exp 声明的最简单方法 here
您可以通过这种方式轻松设置到期时间
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 });
甚至更好:
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: '1h' });
这会将 exp 声明放入 jwt 中,如下所示,并为 iat 和 exp 提供正确的 unix 纪元时间(到期时间比发布时间晚 1 小时),例如它会像这样(可以在 jwt 库中轻松验证):
{
"data": "foobar",
"iat": 1539549664,
"exp": 1539553264
}
请注意,上述 expiresIn
选项特定于 jsonwebtoken 库,更通用的方式如下:
jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, 'secret');
通过将 *1000
添加到 exp
和 iat
,您将看到正确的日期。
var d1 = new Date(decoded.exp*1000);
var d2 = new Date(decoded.iat*1000);