部署在Azure Web App的Passport中req.user为undefined的问题求助
核心问题
前后端分别部署在Azure Web App,Passport Google OAuth认证在本地HTTP环境正常,但Azure HTTPS环境下/auth/login/success路由中req.user返回undefined。已确认serializeUser能正常获取Google用户数据、浏览器已生成Cookie,且添加了trust proxy配置。
具体修复步骤
1. 修复Cookie跨域与安全配置
Azure是HTTPS环境,跨域场景下Cookie必须配置正确的secure和sameSite属性,否则浏览器会拒绝携带Cookie到后端。修改cookieSession配置:
app.use( cookieSession({ name: "session", keys: [process.env.COOKIE_SESSION_KEY], maxAge: 24 * 60 * 60 * 1000, // 生产环境强制HTTPS Cookie secure: process.env.NODE_ENV === "production", // 跨域场景必须设为none,且需配合secure: true sameSite: process.env.NODE_ENV === "production" ? 'none' : 'lax', httpOnly: true, // 增强Cookie安全性,避免前端JS访问 }) );
2. 修正路由挂载错误
后端index.js中重复挂载了authRouter到多个路径,导致路由路径冲突,session无法正确关联。删除多余的路由挂载,只保留一次:
const authRouter = require("./routes/auth"); app.use("/auth", authRouter); // 删除以下重复挂载的代码 // const successRouter = require("./routes/auth"); // app.use("/login/success", successRouter); // const failedRouter = require("./routes/auth"); // app.use("/login/failed", failedRouter);
前端调用路径process.env.REACT_APP_BE_URL+"/auth/login/success"本身正确,无需修改。
3. 开启Azure ARR Affinity设置
进入Azure Portal的后端Web App -> 配置 -> 常规设置,确保ARR Affinity设置为On。该选项保证同一用户的请求被路由到同一服务器实例,避免session跨实例丢失。
4. 验证Google OAuth回调地址
确认Google Cloud Console中配置的授权重定向URI是后端的完整HTTPS地址,例如:https://your-backend-app-name.azurewebsites.net/auth/google/callback
5. 排查deserializeUser执行情况
在Passport配置中添加deserializeUser日志,确认session是否被正确解析:
passport.deserializeUser((user, done) => { console.log("Deserializing user:", JSON.stringify(user)); done(null, user); });
如果日志没有输出,说明Cookie没有被后端正确接收,回到Cookie配置和CORS设置检查。
6. 确认CORS Origin配置
确保process.env.HOST是前端Web App的完整HTTPS地址(如https://your-frontend-app-name.azurewebsites.net),无多余斜杠或协议错误。
验证流程
- 部署修改后的后端代码到Azure
- 清空浏览器缓存与Cookie,重新发起OAuth登录流程
- 查看后端日志,确认
deserializeUser触发且req.user正常赋值
内容的提问来源于stack exchange,提问作者Jess

