无法正确设置JWT的Exp和Iat
我有点被这一个难住。 我正在尝试build立一个有效的JWT。 我正在使用jsonwebtoken中间件的node.js。 我已经遵循了回购协议( 位于这里 )的文件,但我一直得到错误的Exp和Iat。 显然我想这样做是正确的,所以我不允许已经过期的智威汤逊。
作为一个testing,我有以下代码:
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
因为1h = 60min * 60s
而在这一刻,你有时间在几秒钟从jwt令牌和秒计算时间。 你只应该比较这个值。
正是在你的情况下,你应该比较jwt令牌时间与你的实际时间在几秒钟内。 如果jwt令牌过期时间大于实际时间,则意味着它仍然有效。 从jwt令牌文档:
exp要求的处理要求当前date/时间必须在exp要求中列出的到期date/时间之前。
编辑:
要从iat获取coorectdate,请将值乘以1000并添加到新的Date构造函数中:
new Date(iat*1000)
基于Krzysztof Sztompka发布的内容,我可以让Ext显示正确的失效date。 (我原来的要求是在未来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显示正确的date(在sign
函数中设置之后,然后在decode
函数中进行完整性检查),我必须将其设置为有效负载的一部分。 我在这里得到了我的答案
所以最后得到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,我将在成功login后将其传递给用户,并允许我检查他们在将来的请求中是否必须通过的JWT是否仍然有效并且尚未到期。