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

React+Axios对接NestJS会话认证时访问受保护接口返回403

解决NestJS Session认证下React Axios 403问题

核心问题

你手动存userId到Cookies完全没用——NestJS的session认证依赖后端设置的会话Cookie(通常是connect.sid这类标识),前端请求必须自动携带这个Cookie,后端才能通过它找到对应的request.session.userId。Postman默认会自动保存并携带Cookie所以测试正常,但React里Axios默认没开启这个配置。

具体修复步骤

1. 配置Axios自动携带Cookie

在创建Axios实例时开启withCredentials,让所有请求自动带上后端设置的会话Cookie:

import axios from 'axios';

const api = axios.create({
  baseURL: '你的后端API地址',
  withCredentials: true, // 关键配置:开启Cookie自动携带
});

export default api;

后续所有接口请求(包括登录、/persons)都用这个实例发起。

2. 后端CORS必须允许Credentials

检查NestJS的CORS配置,必须明确开启credentials: true,同时origin不能设为*(浏览器禁止带Cookie的请求使用通配符域名),要指定你的前端具体地址:

// main.ts中的CORS配置
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors({
    origin: 'http://localhost:3000', // 替换成你的React前端地址
    credentials: true, // 允许跨域请求携带Cookie
  });
  await app.listen(3000);
}
bootstrap();

3. 删除前端手动存userId到Cookie的代码

你前端存的userId对后端session认证没有任何作用,反而会混淆逻辑,直接删掉这块冗余操作。

4. 验证会话Cookie是否正确设置

登录接口调用后,打开浏览器开发者工具(Application -> Cookies),检查是否存在后端返回的会话Cookie,且Domain、Path属性与后端地址匹配。

额外排查点

  • 确认后端session存储配置正常(比如express-session的内存存储或Redis),Postman能正常工作说明这块大概率没问题,但可以核对下session的name、secret等参数。
  • 检查Guard中的逻辑,确保是读取request.session.userId而非其他字段,避免字段名拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:47:13