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

如何修复JWT无效令牌错误?持续触发JsonWebTokenError(无效签名)

解决JWT无效签名(invalid signature)问题

常见排查方向

  • JWT密钥不匹配
    这是触发该错误的核心原因:

    • 检查generateToken和isAuth中使用的process.env.JWT_KEY是否完全一致。注意你在生成令牌时用了模板字符串${process.env.JWT_KEY},若密钥本身包含特殊字符,可能会被意外转义,建议直接使用process.env.JWT_KEY,去掉多余的模板字符串包裹。
    • 确认服务启动时环境变量是否正确加载,生成令牌和验证令牌的服务实例必须使用同一个密钥,避免开发/生产环境密钥不一致。
  • 令牌传输/存储被篡改

    • 验证前端传递的令牌是否完整,检查Authorization头是否为正确的Bearer <token>格式,没有额外的空格、换行或截断。
    • 本地解码示例令牌的payload(可调用jwt.decode(token)),确认内容和用户信息匹配,同时检查签名部分是否和生成时一致。
  • 代码逻辑细节问题

    • 确认isAuth中的令牌截取逻辑:authorization.slice(7)是否准确去掉了Bearer 前缀,可添加日志输出截取后的token值,和生成的令牌对比。
    • 检查generateToken中的_id字段:MongoDB的ObjectId在签名时会自动转为字符串,验证时要确保类型匹配(避免出现ObjectId和字符串不兼容的情况)。

快速验证方案

  1. 临时将process.env.JWT_KEY替换为固定字符串(比如"mysecurekey123"),重新生成令牌并验证,若错误消失,说明环境变量加载异常。
  2. 在generateToken和isAuth中分别打印process.env.JWT_KEY的值,确认两者完全相同(包括大小写、特殊字符)。
  3. 直接在isAuth中硬编码生成的令牌进行测试,排除请求头传递的问题。

代码修复建议

修改generateToken的密钥部分,移除模板字符串:

export const generateToken = (user) => {
  return jwt.sign(
    {
      _id: user._id,
      name: user.name,
      email: user.email,
      isAdmin: user.isAdmin,
    },
    process.env.JWT_KEY,
    {
      expiresIn: "30d",
    }
  );
};

添加日志便于调试:

export const isAuth = (req, res, next) => {
  const authorization = req.headers.authorization;
  if (authorization) {
    const token = authorization.slice(7);
    console.log("Received Token:", token);
    console.log("JWT Key:", process.env.JWT_KEY);
    jwt.verify(token, process.env.JWT_KEY, (err, decode) => {
      if (err) {
        console.log("Verify Error:", err);
        res.status(401).send({ err });
      } else {
        req.user = decode;
        next();
      }
    });
  } else {
    res.status(401).send({ message: "No Token" });
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:51:32