javascript - jwt.verify() 在过期时间为 24h 时返回 jwt expired
问题描述
我使用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)
}
jwt.header:
{
"alg": "HS256",
"typ": "JWT"
}
有效载荷:
{
"filePath": "path",
"iat": 1557833831,
"exp": 1557920231
}
当我在我的真实应用程序中测试上面提到的代码片段时,我收到一条错误消息:
jwt expired
使用jwt 调试器,令牌是有效的,应该在 24 小时后过期。verify()
检查过期返回的错误。jwt如何检查过期?或者它不检查它?
解决方案
所以既然问题是,jwt如何检查过期日期,它基本上取决于可以根据JWT RFC实现的一些属性
一个是exp
。如果令牌在当前日期时间之前过期,则无法处理 JWT
“exp”(过期时间)声明标识了 JWT 不能被接受处理的过期时间或之后。“exp”声明的处理要求当前日期/时间必须在“exp”声明中列出的到期日期/时间之前。
实施者可以提供一些小的余地,通常不超过几分钟,以解决时钟偏差。它的值必须是一个包含 NumericDate 值的数字。使用此声明是可选的。
另一个需要注意的是 the iat
,它代表发行于
“iat”(发布时间)声明标识了 JWT 的发布时间。此声明可用于确定 JWT 的年龄。它的值必须是一个包含 NumericDate 值的数字。使用此声明是可选的。
据我所知,可以用于时间验证的最后一个是 ,nbf
,代表not before
“nbf”(not before)声明标识了 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 );
}
这将输出
Object {hello: "world", iat: 1557840459, exp: 1557926859}
这可以在代码框链接上进行验证
推荐阅读
- spring - 如何在方法内部而不是在方法级别使用 AOP 注释
- python - 如何有条件地从另一个数据框中替换 Pandas 数据框列值
- python-3.x - 如何在 casefolding 中询问有关小写错误的问题?
- android - Android # DefaultDispatch(5068) SIGSEGV(SEGV_MAPERR)
- javascript - Discord SDK 向发送命令的服务器的所有通道发送消息
- azure - Facebook 刮板:清除 URL
- sql - 解析日期时出现 Bigquery 时区转换错误
- spring - Spring HATEOAS:请求参数在链接中显示为路径变量
- reactjs - A/B 测试在谷歌中添加元素优化渲染两次(React/Nextjs 应用程序)
- prolog - 如何在 ECLiPSe 中读取大型 Prolog 文件?