设置SameSite无效,Google Auth会话Cookie被拦截求助
我的Google Auth会话Cookie被拦截,网络面板显示拦截状态。该问题已困扰三天,尝试在cookie-session配置中设置SameSite为'none'、secure为true,但无任何效果。
相关代码
Index.js 主文件
const cookieSession = require('cookie-session'); const cors = require('cors'); const express = require('express'); const bodyParser = require('body-parser'); const mongoose = require('mongoose'); const listingRoutes = require('./routes/listingRoutes'); const userRoutes = require('./routes/userRoutes'); const authRoutes = require('./routes/authRoutes'); const app = express(); const PORT = process.env.PORT; const passport = require('passport') const passportCfg = require('./passport') app.use(cors({ origin: [process.env.FRONTEND_URL, process.env.BACKEND_URL], methods: 'GET,POST,PUT,DELETE,PATCH', credentials: true })); app.use(cookieSession({ name: 'session', keys: ['weerit'], maxAge: 24*60*60*1000, sameSite: 'none', secure: true })); app.use(passport.initialize()); app.use(passport.session()); app.use(bodyParser.json({ limit: '100mb' })); // Routes app.use('/auth', authRoutes); app.use('/api/users', userRoutes); app.use('/api/listings', listingRoutes); mongoose.connect(process.env.MONGO_URI) .then(() => { // Listen for requests app.listen(PORT, () => { console.log(`Connected to db, listening on port ${PORT}`); }); }) .catch((err) => { console.log(err); });
验证API端点代码
//res.setHeader('X-Content-Type-Options', 'nosniff'); if(req.user){ res.status(200).json({ success: true, message: "success", user: req.user, cookies: req.cookies }) }else{ res.status(403).json({ message: "Auth has Failed" }) } })
此API端点直接在地址栏访问可正常工作,但通过fetch请求调用时失效。
排查建议
- 补全Fetch请求配置:前端
fetch请求必须添加credentials: 'include'参数,跨域请求才会携带Cookie,示例:
fetch('你的API地址', { method: 'GET', credentials: 'include' })
- 确认HTTPS环境:
secure: true要求Cookie仅在HTTPS环境下传输,本地开发用HTTP时浏览器会拒绝保存,可临时将secure设为false(仅开发环境),生产环境必须保持true。 - 校验Cookie配置生效情况:在
cookie-session中间件后添加日志,确认响应头的Cookie参数是否正确:
app.use((req, res, next) => { console.log('Set-Cookie header:', res.getHeader('Set-Cookie')); next(); });
- 核对CORS Origin:确保
process.env.FRONTEND_URL完全匹配前端实际域名(含协议、端口,比如https://your-frontend.com或http://localhost:3000),通配符*无法与credentials: true共存。 - 检查浏览器隐私设置:部分浏览器的「阻止第三方Cookie」设置会拦截跨域Cookie,可临时关闭测试;若需兼容该场景,建议改用Token认证替代Cookie会话。
内容的提问来源于stack exchange,提问作者Mark Vitko
相关产品推荐
相关产品推荐

