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

已获取JWT仍无法访问员工接口,返回403 Forbidden

问题诊断与修复方案

核心问题:JWT令牌提取错误

你遇到的403 Forbidden是因为verifyJWT中间件里提取token的代码写错了,导致传入JWT验证的不是有效令牌:

在verifyJWT中间件中,这行代码:

const token = authHeader.split("")[1];

错误原因:split("")会把字符串拆成单个字符的数组(比如"Bearer abc123"会变成["B","e","a","r","e","r"," ","a","b",...]),取索引1得到的是第二个字符,完全不是有效的JWT令牌。JWT验证失败后就会返回403。

修复代码:把split("")改成split(" ")(用空格分割),因为Authorization头的格式是Bearer <token>,空格是分隔符:

const jwt = require("jsonwebtoken");
require("dotenv").config();

const verifyJWT = (req, res, next) => {
  const authHeader = req.headers["authorization"];
  if (!authHeader) return res.sendStatus(401);
  console.log(authHeader);
  // Bearer token格式,用空格分割取第二个元素
  const token = authHeader.split(" ")[1];
  jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, decoded) => {
    if (err) return res.sendStatus(403);
    req.user = decoded.username;
    next();
  });
};

module.exports = verifyJWT;

次要问题:Cookie参数拼写错误

同时检查到authController里设置refresh token cookie时有拼写错误:

res.cookie("jwt", refreshToken, {
  httpOnly: true,
  ameSite: "None", // 这里应该是sameSite
  secure: true,
  maxAge: 24 * 60 * 60 * 1000,
});

修正为:

res.cookie("jwt", refreshToken, {
  httpOnly: true,
  sameSite: "None",
  secure: true,
  maxAge: 24 * 60 * 60 * 1000,
});

这个错误不影响当前access token的验证,但会导致refresh token的cookie设置无效,建议一并修复。

验证步骤

修复后,在Thunder Client中调用/employees接口时,确保Authorization头的格式是:
Bearer <你的accessToken>
注意Bearer和令牌之间有一个空格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:55:20