接口测试未传token时返回200而非401状态码的问题排查
问题根因
你将token赋值为空字符串''的操作,并没有模拟出「客户端未携带鉴权凭证」的真实场景:
- 执行
.set('x-auth-token', '')时,请求会携带值为空的x-auth-token头,和完全不携带该请求头的未登录状态不一致 - 你的鉴权中间件大概率没有对空字符串这类无效token做拦截判断,导致空值被放行,最终接口正常执行业务逻辑返回200状态码
修复方案
1. 调整测试用例的请求逻辑
修改exec方法,仅当token有有效真值时才设置鉴权请求头,避免空字符串被当作有效头传给服务端:
const exec = async () => { const requestBuilder = request(server) .put('/api/genres/' + id) .send({ name: newName }); // token为null/undefined/空字符串等falsy值时,不设置鉴权头 if (token) { requestBuilder.set('x-auth-token', token); } return await requestBuilder; }
未登录场景的用例里,将token赋值为null即可,不需要赋值空字符串:
it('should return 401 if client is not logged in', async () => { token = null; const res = await exec(); expect(res.status).toBe(401); });
2. 校验鉴权中间件逻辑
检查服务端的鉴权中间件,确保所有无效token场景都被正确拦截,参考正确实现:
const jwt = require('jsonwebtoken'); const config = require('config'); module.exports = function auth(req, res, next) { const token = req.header('x-auth-token'); // 无token、token为空字符串等场景直接返回401 if (!token) return res.status(401).send('未授权,缺少有效鉴权凭证'); try { const decoded = jwt.verify(token, config.get('jwtPrivateKey')); req.user = decoded; next(); } catch (err) { // token格式非法、篡改、过期返回400 return res.status(400).send('鉴权凭证无效'); } }
确认需要鉴权的路由都正确挂载了该中间件,避免漏挂载导致鉴权不生效。
内容的提问来源于stack exchange,提问作者Michelangelo
相关产品推荐
相关产品推荐

