You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask容器部署后每次调用API返回新session ID导致Google SSO校验失败

问题解决方案:Flask+React Docker部署后Google SSO state校验401问题

核心原因

本地测试正常、部署后出现sessionID每次请求刷新的问题,本质是生产环境HTTPS、跨域、反向代理场景下,会话Cookie没有被浏览器正确存储或传递,和是否使用docker-compose无关。你已经排查过session存储切换为redis仍无效,可排除存储层问题,重点校验以下配置:

具体排查&修复方案

  • 修正Flask会话Cookie配置

生产环境HTTPS、前后端跨子域名的场景下,默认的session cookie配置会失效,需添加以下配置:

# 替换为你自己的根域名,比如前端是app.xxx.com、后端是api.xxx.com,就填".xxx.com"
app.config["SESSION_COOKIE_DOMAIN"] = ".yourdomain.com"
# HTTPS环境必须开启,确保浏览器仅在HTTPS请求下携带cookie
app.config["SESSION_COOKIE_SECURE"] = True
# 禁止JS读取cookie,提升安全性
app.config["SESSION_COOKIE_HTTPONLY"] = True
# Google SSO回调属于跨站跳转,Samesite设为Lax即可,部分场景需设为None(必须配合SESSION_COOKIE_SECURE=True使用)
app.config["SESSION_COOKIE_SAMESITE"] = "Lax"
app.config["PERMANENT_SESSION_LIFETIME"] = 86400 # 24小时有效期,按需调整
  • 适配AWS反向代理(ALB/nginx)

AWS的负载均衡会把HTTPS请求转为HTTP转发到后端容器,Flask默认无法识别原始请求的协议,会导致cookie配置不生效,需要添加代理修复中间件:

from werkzeug.middleware.proxy_fix import ProxyFix
# x_proto=1表示取X-Forwarded-Proto头作为请求协议,x_host=1表示取X-Forwarded-Host作为请求域名
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

同时确认AWS ALB没有过滤Cookie头即可,你用redis存储session不需要开启会话保持。

  • 修正CORS与前端请求配置

跨域场景下带cookie的请求需要前后端配合配置:

# 后端Flask-CORS配置,必须精确指定前端域名,不能用*,同时开启凭据支持
from flask_cors import CORS
CORS(app, origins=["https://app.yourdomain.com"], supports_credentials=True)

前端请求必须开启携带凭据:

// axios全局配置
axios.defaults.withCredentials = true
// 原生fetch请求配置
fetch("/api/sso/login", {
  credentials: "include"
})
  • 校验Docker容器时间同步

如果Docker容器的系统时间和实际时间偏差过大,会导致cookie的过期时间异常,浏览器会直接丢弃cookie,执行docker exec <后端容器ID> date检查容器时间是否和当前时间一致,偏差过大可以挂载宿主机的/etc/localtime到容器内解决。

内容的提问来源于stack exchange,提问作者Maciej B. Nowak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:54:03