生产环境下Express CORS服务器无法向客户端发送Cookie的问题求助
各位大佬好,我遇到一个头疼的问题:本地开发环境中,我的服务器(localhost:5000)可以正常向客户端(localhost:5173)发送Cookie,但部署到生产环境后,服务器(https://task-x-server.onrender.com)没法给客户端(https://task-x-1.vercel.app)传递Cookie了。
我的技术栈是:客户端用ReactJS + Axios发起请求,服务端用Express + Passport做认证。本地环境下客户端能正常收到Cookie,但生产构建后完全收不到。
下面是我服务端和客户端相关的配置代码,麻烦帮忙看看哪里出问题了:
服务端代码
index.ts(主入口配置)
import cors from "cors"; import helmet from "helmet"; import getCookies from "./middlewares/getCookies"; import bodyParser from "body-parser"; app.use(helmet({ crossOriginResourcePolicy: { policy: "cross-origin" } })); app.use(cors({ origin: clientUrl, credentials: true })); app.use(bodyParser.json()); app.use(getCookies); googleAuthRoutes(app);
getCookies.ts(解析Cookie的中间件)
import { NextFunction, Request, Response } from "express"; const getCookies = (req: Request, res: Response, next: NextFunction) => { const cookies = req.headers.cookie; if (cookies) { const values = cookies.split(";").reduce((res, item) => { const data = item.trim().split("="); return { ...res, [data[0] as string]: data[1] }; }, {}); req.cookies = values; } next(); }; export default getCookies;
requireJwt.ts(验证Cookie中JWT的中间件)
import { NextFunction, Request, Response } from "express"; import jwt, { JwtPayload } from "jsonwebtoken"; import keys from "../config/keys"; import types from "../types/express"; export const requireJwt = (req: Request, res: Response, next: NextFunction) => { const { token } = req.cookies; const { jwtSecret, clientUrl } = keys; try { const { user } = jwt.verify(token, jwtSecret) as JwtPayload; req.user = user; next(); } catch (err) { res.clearCookie("token"); res.status(401).send({ error: "You must be logged in" }); res.redirect(clientUrl); } }; export default requireJwt;
authRoutes.ts(认证路由:设置Cookie和验证用户)
import passport from "passport"; import { Express, Request, Response } from "express"; import requireJwt from "../middlewares/requireJwt"; import jwt from "jsonwebtoken"; import dayjs from "dayjs"; import keys from "../config/keys"; const { jwtSecret, clientUrl } = keys; const googleAuthRoutes = (app: Express) => { app.get( "/auth/google/callback", passport.authenticate("google", { session: false, }), (req, res) => { const { user } = req; const token = jwt.sign({ user }, jwtSecret, { expiresIn: "1d", }); res.cookie("token", token, { secure: process.env.NODE_ENV !== "development", httpOnly: true, sameSite: "none", expires: dayjs().add(1, "day").toDate(), }); res.redirect(`${clientUrl}/setup`); } ); app.get("/api/current_user", requireJwt, (req, res) => { res.send(req.user); }); };
客户端代码
api/index.ts(Axios配置)
import axios, { AxiosRequestConfig } from "axios"; import keys from "../config/keys"; axios.defaults.baseURL = keys.server; export const axiosFetchUser = async () => { const { data } = await axios.get(`/api/current_user`, { withCredentials: true, }); return data; };
App.tsx(调用用户接口的组件)
import { ReactElement, useEffect, useState } from "react"; import Landing from "./landing/Landing"; import ProfileSetup from "./profile/profile-setup/ProfileSetup"; import { useDispatch } from "react-redux"; import { AppThunkDispatch } from "./types"; const App = (): ReactElement => { const dispatch = useDispatch<AppThunkDispatch>(); const [user, setUser] = useState(); useEffect(() => { const fetchUser = async () => { try { const userData = await axiosFetchUser(); setUser(userData); } catch (err) { console.error("Failed to fetch user:", err); } }; fetchUser(); }, []); return ( <Routes> <Route path="/" element={<Landing />} /> <Route path="/setup" element={<ProfileSetup />} /> </Routes> ); };
麻烦各位帮忙排查一下,生产环境下Cookie无法传递的原因可能是什么?谢谢大家!
备注:内容来源于stack exchange,提问作者userWantsToCode
相关产品推荐
相关产品推荐

