jwt.verify() 当过期时间为 24h 时返回 jwt 已过期

Sli*_*lim 6 javascript jwt

我使用jwt创建一个令牌:

const jwt = require('jsonwebtoken');
const token = jwt.sign({
filePath: "path/to/file"
}, 'secretKey', {
expiresIn: "24h"
});
try {
  console.log(token)
  var decoded = jwt.verify(token, 'secretKey');
} catch(err) {
 console.log(err)
}
Run Code Online (Sandbox Code Playgroud)

jwt.标头:

{
  "alg": "HS256",
  "typ": "JWT"
}
Run Code Online (Sandbox Code Playgroud)

有效负载:

{
  "filePath": "path",
  "iat": 1557833831,
  "exp": 1557920231
}
Run Code Online (Sandbox Code Playgroud)

当我在真实的应用程序中测试上面提到的代码片段时,我收到一条错误消息:

jwt expired
Run Code Online (Sandbox Code Playgroud)

使用jwt 调试器,令牌有效,并应在 24 小时后过期。verify()检查过期返回的错误。jwt如何检查过期时间?或者它不检查它?

Ice*_*kle 2

所以既然问题是,jwt如何检查过期日期,它基本上取决于可以根据JWT RFC实现的一些属性

其中之一是exp。如果令牌在当前日期时间之前过期,则无法处理 JWT

“exp”(过期时间)声明标识了过期时间,在此时间或之后 JWT 不得接受处理。“exp”声明的处理要求当前日期/时间必须早于“exp”声明中列出的到期日期/时间。

实施者可以提供一些小的余地,通常不超过几分钟,以解决时钟偏差。它的值必须是包含 NumericDate 值的数字。此声明的使用是可选的。

另一个值得注意的是iat,它代表发行于

“iat”(发布于)声明标识了 JWT 的发布时间。此声明可用于确定 JWT 的年龄。它的值必须是包含 NumericDate 值的数字。此声明的使用是可选的。

据我所知,可用于时间验证的最后一个是,,nbf代表不之前

“nbf”(不早于)声明标识了不得接受 JWT 进行处理的时间。“nbf”声明的处理要求当前日期/时间必须晚于或等于“nbf”声明中列出的日期/时间。实施者可以提供一些小的余地,通常不超过几分钟,以解决时钟偏差。它的值必须是包含 NumericDate 值的数字。此声明的使用是可选的。

现在,对于手头的代码,我没有看到任何内容,具有以下设置,这对我来说非常有用

const jwt = require('jsonwebtoken');

const token = jwt.sign( {
  hello: 'world'   
}, 'myverysecretkey', {
    expiresIn: '24h'
});

try {
    const verify = jwt.verify( token, 'myverysecretkey' );
    console.log( verify );
} catch (err) {
    console.error( err );
}
Run Code Online (Sandbox Code Playgroud)

这会输出

Object {hello: "world", iat: 1557840459, exp: 1557926859}
Run Code Online (Sandbox Code Playgroud)

这可以在codesandbox链接上进行验证