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

