node.js - 如何在 node.js 中使用 jwt.sign()
问题描述
我开始在 node.js 中学习 jwt。但我被困在这里
const jwt = require('jsonwebtoken');
let token = jwt.sign({name:"Sachin"},"secret" ,{expiresIn: '2000s'});
console.log("generated token", token);
这会在多次调用中返回令牌的不同签名部分,但每次调用中的有效负载和密钥都是相同的。那么这是怎么发生的呢?
此外,当我尝试使用复制粘贴验证它们时,它也会给出错误“无效令牌”
jwt.verify(token,"secret",(err,result)=>{
if(err){
console.log(err);
}
console.log("Verified "+result);
这里发生了什么?
令牌 1 生成是 =>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiU2FjaGluIiwiaWF0IjoxNjE0NTQxOTk0fQ.O518KGK_m47Mw2fBBKDdABZUFGxXzYShrMoYQnLJQwM
生成令牌 2 是 =>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiU2FjaGluIiwiaWF0IjoxNjE0NTQyMDA4fQ.FwY_XJ0ryAZzuJ1EpaUkqVNTNutkA63t0Vkie468zkM
解决方案
这是因为每次生成令牌时exp
都会计算新的到期时间 ( )(在您的示例中为当前时间 + 2000 秒),并且到期时间是有效负载的一部分。标头或有效负载的每次更改都会导致签名的更改,因为签名是标头和有效负载的哈希。
jwt.sign
默认情况下添加一个(在声明时发布),它与(关于每次生成令牌时更改有效负载iat
)具有相同的效果。exp
两个时间戳的分辨率均为 1 秒(Unix 纪元时间格式)。
您的有效载荷将如下所示:
{
"name": "Sachin",
"iat": 1614540008
"exp": 1614542008
}
当您的目标是(为了学习)在连续调用中生成完全相同的令牌时,您必须避免各种时间戳(iat
, exp
, nbf
(不是之前))。
这可以通过{noTimestamp:true}
调用中的选项来实现:
jwt.sign(payload, "secret", {noTimestamp:true})
您可以在https://jwt.io/上检查生成的令牌以查看里面的内容。
推荐阅读
- java - Spring:如何从属性文件中访问属性,以便在spring中使用实体中的属性
- excel - 隔离部分字符串并删除包含它的任何单元格
- jsrender - JsViews:同时动态更新/刷新多个“选择”上的数据 - 使用依赖=
- apache - 如何让 apache 让我用 Location 标头定义“200 OK”响应的主体?
- python - 在 Python 的 matplotlib 图表中打印数据的数量、平均值和标准差
- javascript - 是否可以使用我现有的 HTML/CSS/JS 迁移到 Django?
- c++ - 使用矢量化 C++ 的矩阵乘法
- java - 热门将当前用户从 firebase 获取到 javaMailAPI
- reactor-netty - 使用 TLS 保护时 RSocket 不工作 - 服务器 java.lang.UnsupportedOperationException - 客户端 java.nio.channels.ClosedChannelException
- google-apps-script - 如何使用谷歌应用脚本获取文件共享权限信息?