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
相关产品推荐
相关产品推荐

