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

接口测试未传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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:48:33