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
相关产品推荐
相关产品推荐

