You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node中jsonwebtoken的jwt.sign()生成令牌缺失自定义载荷问题求助

JWT自定义载荷丢失问题解决办法

先确认传入的用户ID是否有效

调用createToken(user)前,先打印console.log(user.id)看看值是不是undefined——要是用户对象里根本没id属性,自定义载荷肯定不会出现。

注意RS256算法的密钥要求

RS256是非对称加密算法,签名必须用PEM格式的私钥,不能用普通字符串当密钥。如果你的secretKey是随便写的文本,就会导致签名时丢失自定义载荷。

正确的私钥格式示例

私钥得是这种PEM格式的字符串:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp
wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5
1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh
3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2
pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX
GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il
AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF
L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k
X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl
U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ
37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=
-----END RSA PRIVATE KEY-----

修正签名代码

把密钥换成私钥,同时加个判断确保user.id存在:

// user.js 修正后
const jwt = require("jsonwebtoken")
const { privateKey } = require("../keyConfig") // 替换为私钥
const createToken = (user) => {
  if (!user.id) {
    throw new Error("生成令牌需要用户ID")
  }
  return jwt.sign({ id: user.id }, privateKey, {
    algorithm: "RS256",
    expiresIn: 12000,
    subject: "Login details",
  })
}

// 测试时传入正确的用户对象
const user = { id: 123 } // 替换为实际用户数据
const token = createToken(user)

手动解码验证载荷

生成令牌后,直接解码第二部分看看有没有自定义字段:

// 在user.js中添加测试代码
const tokenParts = token.split('.')
const payload = JSON.parse(Buffer.from(tokenParts[1], 'base64').toString())
console.log(payload) // 查看输出是否包含id字段

如果这里能看到id,说明生成没问题,问题出在验证环节;如果看不到,回到前两步排查。

验证环节的小调整

authMiddleware.js里别在getTokenFromHeader里提前解码,直接返回令牌即可,express-jwt会自动处理验证和解码。另外确保验证用的公钥和签名用的私钥是配对的:

// authMiddleware.js 修正后
const { expressjwt: jwt } = require("express-jwt")
const js = require('jsonwebtoken')
const { publicKey } = require("../keyConfig") // 确保公钥正确

const getTokenFromHeader = (req) => {
  if (
    req.headers.authorization &&
    req.headers.authorization.split(" ")[0] === "Bearer"
  ) {
    return req.headers.authorization.split(" ")[1]
  }
  return null
}

const checkIfAuth = jwt({
  algorithms: ["RS256"],
  secret: publicKey,
  getToken: getTokenFromHeader,
})

内容的提问来源于stack exchange,提问作者partap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:00:58