首页 > 解决方案 > 如何在 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

标签: node.jsjwt

解决方案


这是因为每次生成令牌时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/上检查生成的令牌以查看里面的内容。


推荐阅读