本地React前端请求NodeJS API登录后浏览器无法保存Cookie的问题求助
我现在在做一个全栈应用,后端用Node+Express开发,部署在AWS EC2实例上,搭配Nginx和pm2运行,连接着AWS上的数据库。用Postman测试时一切正常:发送POST /signin请求,传入email和password就能拿到认证Cookie,后续请求GET /subscriptions也能返回200 OK。
现在我要把前端跑起来,前端是用Vite搭建的React项目,还在localhost环境,用React Query和Axios与后端交互。
但我卡在了一个问题上:后端明明返回了Cookie,浏览器就是死活不保存。我已经试了各种办法:
- 换Firefox和Chrome浏览器测试
- 用
127.0.0.1代替localhost访问前端 - 在
hosts文件里把自定义域名app.something.something映射到127.0.0.1,用这个域名访问 - 换成本地运行的后端(而非AWS上的版本)测试
- 反复调整服务器上Nginx的响应头配置
- 给后端加了
cors包来设置请求头(因为同时开Nginx和CORS会导致重复头,所以我把Nginx的相关配置删了) - 把Cookie的所有安全选项都关掉(
Secure、sameSite、httpOnly)
这些尝试都没用,我实在没辙了,谷歌和Copilot也找不到新的解决方向。再说一遍,Postman里完全正常,所以我觉得后端没问题,应该是浏览器本地环境的CORS或者请求头相关的什么东西在搞鬼...
下面是我的相关代码配置:
后端服务器配置
import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; import express from "express"; import morgan from "morgan"; import cors from "cors"; import cookieParser from "cookie-parser"; import router from "./router"; import { createNewUser, signIn } from "./handlers/users"; import { protect } from "./modules/auth"; const app = express(); const corsOptions = { origin: "http://localhost:5173", // 我试过改成当前访问localhost的各种地址 credentials: true, }; app.use(cookieParser()); app.use(cors(corsOptions));
登录成功后设置Cookie的代码
const token = createJWT(user); res.cookie("token", token, { httpOnly: true, secure: false, sameSite: "None", }); res.json("Authentication success");
前端Axios配置
export const authApi = axios.create({ baseURL: API_URL, withCredentials: true, }); authApi.defaults.headers.common["Content-Type"] = "application/json"; export const loginUser = async (user: LoginInput) => { const response = await authApi.post<ILoginResponse>("/signin", user); return response.data; };
现在的情况是,Firefox里能看到响应里带着Cookie,但去Storage > Cookies里看是空的,后续请求也不会带上这个Cookie,结果就是一堆401错误。我也检查了POST /signin的请求头和响应头,能确认Cookie在响应里,但就是存不进去。
真的求帮忙,我已经卡了两天了,完全不知道还有什么能试的。
备注:内容来源于stack exchange,提问作者Lazar
相关产品推荐
相关产品推荐

