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

Node.js登录授权问题:携带Token调用GET接口触发Catch错误排查

问题分析与修复方案

核心错误1:Authorization头未移除"Bearer "前缀

从你的Postman截图和控制台输出可以看到,请求头的authorization字段值格式为Bearer <token>,但认证中间件直接将整个字符串传入jwt.verify()——JWT验证仅需纯token部分,包含前缀会直接导致验证失败,触发"invalid token"错误。

核心错误2:JWT密钥不一致

登录接口中使用变量SECRET_JWT_CODE生成token,但中间件里硬编码了字符串"SECRET_JWT_CODE"作为验证密钥。如果SECRET_JWT_CODE变量的实际值和该字符串不匹配,token必然验证失败。


修复步骤

1. 处理Authorization头的前缀

在中间件中提取纯token部分,通过split方法分割前缀与token:

const access_token = req.headers["authorization"]?.split(' ')[1];

同时保留无token时的拦截逻辑,避免格式错误导致的异常。

2. 统一JWT密钥

确保中间件与登录接口使用相同的密钥变量,建议从环境变量读取以避免硬编码:

const SECRET_JWT_CODE = process.env.SECRET_JWT_CODE;

修改后的认证中间件代码

const jwt = require("jsonwebtoken");
// 统一密钥,与登录接口保持一致
const SECRET_JWT_CODE = process.env.SECRET_JWT_CODE;

const authenticate = (req, res, next) => {
  const authHeader = req.headers["authorization"];
  // 提取Bearer前缀后的纯token
  const access_token = authHeader?.split(' ')[1];

  if (!access_token) return res.status(401).send("Access denied! no token provided.");

  try {
    const decoded = jwt.verify(access_token, SECRET_JWT_CODE);
    req.receive = decoded;
    next();
  } catch (error) {
    // 开发环境可打印错误详情排查,生产环境建议移除
    console.error("JWT验证错误:", error.message);
    res.status(400).send("invalid token.");
  }
};

module.exports = authenticate;

额外检查点

  • 确认登录接口返回的access_token是有效JWT字符串,可通过jwt.io在线验证格式与签名。
  • Postman中确保Authorization头格式正确:Bearer <你的token>,注意Bearer与token之间有一个空格。

内容的提问来源于stack exchange,提问作者sumanth.js

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:30:54