使用Passport+Express接入passport-discord部署后浏览器不存储Cookie问题
问题修复方案
1. 适配跨域HTTPS场景的Session Cookie配置
浏览器的第三方Cookie限制会拦截跨域下发的未配置安全属性的Cookie,这是本地正常线上失效的核心原因,修改API主文件的session配置:
app.use( session({ secret: 'session secret', // 建议迁移到环境变量存储,禁止硬编码 cookie: { maxAge: 7 * 24 * 60 * 60 * 1000, // 原配置仅30秒有效期过短,可按需调整 secure: process.env.NODE_ENV === 'production', // 生产环境开启HTTPS-only sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax', // 跨域场景必须设为none httpOnly: true // 开启后可避免XSS攻击窃取Cookie }, resave: false, saveUninitialized: false, store: MongoStore.create({ mongoUrl: 'database uri', // 建议迁移到环境变量存储 }), }) );
2. 开启Express代理信任
Vercel等Serverless平台通过反向代理转发请求,需要开启代理信任才能正确识别HTTPS协议,否则带secure属性的Cookie不会被下发,在API主文件的CORS配置前添加以下代码:
app.set('trust proxy', 1);
3. 修正授权回调重定向地址
当前auth.js中回调重定向地址写死为本地地址,部署后需替换为线上前端地址,建议用环境变量区分环境:
router.get( '/discord/redirect', passport.authenticate('discord'), (req, res) => { const redirectUrl = process.env.NODE_ENV === 'production' ? 'https://你的线上前端域名/guilds' : 'http://localhost:3001/guilds'; res.redirect(redirectUrl); } );
4. 校验CORS配置
确保CORS配置中的frontend website url为线上前端的完整根域名,不要携带末尾斜杠,例如填写https://xxx.vercel.app而非https://xxx.vercel.app/。
5. 校验Discord OAuth配置
登录Discord开发者后台,在应用的OAuth2设置页的Redirects列表中,确认已添加线上回调地址https://你的线上API域名/discord/redirect,且和代码中callbackURL的取值完全一致。
内容的提问来源于stack exchange,提问作者FC5570
相关产品推荐
相关产品推荐

