无法正确设置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是否仍然有效并且尚未到期。