无法正确设置JWT的Exp和Iat

Ebb*_*bbs 10 javascript node.js jwt json-web-token

我有点难过这个.我正在尝试建立一个有效的JWT.我正在使用node.js和jsonwebtoken中间件.我已经按照repo(位于此处)上的文档进行操作,但我一直得到错误的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);
Run Code Online (Sandbox Code Playgroud)

这个输出是:

{ 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)
Run Code Online (Sandbox Code Playgroud)

如何让时间戳不反映javascript时代,而是从现在起1小时后的时间?(对于iat和exp.)

Krz*_*pka 16

这个:

new Date().getTime()
Run Code Online (Sandbox Code Playgroud)

给你几毫秒的时间.但是jwt令牌(iat,exp)的时间是以秒为单位,因此我们必须将结果除以1000.

var actualTimeInSeconds = new Date().getTime()/1000;
Run Code Online (Sandbox Code Playgroud)

如何从现在开始在几秒钟内获得一些时间:

(new Date().getTime() + someTimeInSeconds * 1000)/1000
Run Code Online (Sandbox Code Playgroud)

如果您需要1小时后:

(new Date().getTime() + 60 * 60 * 1000)/1000
Run Code Online (Sandbox Code Playgroud)

因为1h = 60min*60 s

此时,您可以在几秒钟内获得jwt令牌和秒计算的时间.您应该只比较这些值.

准确地说,在您的情况下,您应该将jwt令牌时间与实际时间(以秒为单位)进行比较.如果jwt令牌到期时间大于实际时间,则表示它仍然有效. 来自jwt令牌的文档:

exp索赔的处理要求当前日期/时间必须在exp索赔中列出的到期日期/时间之前.

编辑:

要从iat获取coorect日期,请将值乘以1000并添加到新的Date构造函数:

new Date(iat*1000)
Run Code Online (Sandbox Code Playgroud)


Ebb*_*bbs 7

根据 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 });
Run Code Online (Sandbox Code Playgroud)

现在,console.log 将显示 Ext 是我想要的,现在 + 1 小时。

为了让 Iat 显示正确的日期(在sign函数中设置它然后在decode函数中检查它的完整性之后),我必须将它设置为有效负载的一部分。我在这里得到了答案

所以最后为了让 Iat 正确显示,我将它添加到负载中,如下所示:

var token = jwt.sign({"id": user._id, "iat": (new Date().getTime())}, configGeneral.JWT, { expiresIn: calculatedExpiresIn });
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

{ 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)
Run Code Online (Sandbox Code Playgroud)

这是未编码的 JWT,我将在用户成功登录后将其传回给用户,并允许我检查他们是否必须传递的 JWT,因为每个未来的请求仍然有效且尚未过期。