我有两个Dash用 Python 编写的(开源)应用程序。在这两个应用程序中,我都使用 Flask-Login 处理常见的身份验证任务,例如登录、注销以及通过签名 cookie 记住用户 session 。换句话说,每个应用程序都有其登录页面,在成功登录时将用户重定向到应用程序的主页。相反,每当用户决定注销时,用户都会被重定向到登录页面。
我希望已成功登录应用程序 1 (app1
) 的用户无需作为事件用户再次登录应用程序 2 (app2
) ID 存储在 Flask session 中(提供跨应用程序的通用 key )。事实上,在本地部署时这可以按预期工作:
dash_app1.py
if __name__ == "__main__":
app1.run(host="172.xx.xxx.x", port=8050, debug=True)
dash_app2.py
if __name__ == "__main__":
app2.run(host="172.xx.xxx.x", port=8051, debug=True)
但是,当我在同一 Google App Engine(标准环境)上运行的两个服务上部署两个应用程序时,我无法重现此情况,即我需要登录 app1
AND app2
分开,这是不可取的。
由于 app1
部署在 https://PROJECT_ID.REGION_ID.r.appspot.com 上(默认服务)和 https://SERVICE_ID-dot-PROJECT_ID.REGION_ID.r.appspot.com 上的 app2
(第二项服务),我本以为按如下方式配置 Flask 应用程序会起作用(根据 documentation ):
dash_app1.py
app1 = dash.Dash(...)
server = app1.server
server.config.update(
SECRET_KEY=SECRET_KEY,
SESSION_COOKIE_DOMAIN=".r.appspot.com"
)
dash_app2.py
# Same as above but for app2.
但是,包含事件用户的 cookie 不会保留在网络浏览器上。
我也尝试过摆弄其他 Flask 配置值,但没有一个能解决我的问题。
任何帮助将不胜感激!
最佳答案
显然,不可能使用.appspot.com
根据此 post 作为部分域 cookie ,重新引用:
It's because appspot.com was added to the public suffix list of domains that modern browsers should not allow cookies to be set for: see here
我猜这已经扩展到 .r.appspot.com
和.<REGION_ID>.r.appspot.com
自从尝试改变 SESSION_COOKIE_DOMAIN
这些值并没有解决问题。
此外,我认为这没有链接到网络浏览器,因为 FireFox 和 Google Chrome 都拒绝 cookie。
但是,这个post中提出了一个解决方案但它在生产环境中似乎并不健壮。
最后,Google App Engine 允许您通过自定义域为您的应用程序提供服务,因此我建议您采用此路线,以便在应用程序之间共享登录 Cookie。
关于python - 如何在 Google App Engine 服务上运行的应用程序之间共享登录 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76200717/