为了账号安全,请及时绑定邮箱和手机立即绑定

Django iframe:每次请求都会创建 sessionkey

Django iframe:每次请求都会创建 sessionkey

蝴蝶不菲 2021-06-27 15:59:56
我有一个用 Django 构建的 shopify 应用程序,直到最近它都运行良好。会话不会在每个请求中持续存在,因此会引发异常,因为在前一个请求中设置的给定密钥的会话不存在。在 Shopify 之外尝试应用程序端点工作正常,会话在请求之间完美地持续存在,因此这绝对是 Shopify 中的一个问题。查看数据库中的会话表,我们看到多个会话密钥具有相同的数据,这表明每个请求正在创建另一个会话。我们如何在 iframe 中跨请求保持会话?
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

使用的 Django 版本是 2.1,它现在包含一个新功能,有助于防止 CSRF 攻击。根据文档,新的 SESSION_COOKIE_SAMESITE 默认值为“Lax”,这是“Strict”和“None”之间的中间地带。

此功能显然适用于独立的 Django 应用程序,但会导致它们在类似于 Shopify 的 iframe 中中断。在 settings.py 中设置 SESSION_COOKIE_SAMESITE = None 解决了这个问题。


查看完整回答
反对 回复 2021-07-06
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

你的方法不再奏效。谷歌将很快禁止 3rd 方 cookie,而 Firefox 和 Safari 已经这样做了。新的应用程序需要实现会话令牌身份验证,因为第三方 cookie 不会很快起作用。

提交应用审查的新应用将在 Chrome 隐身标签下进行测试,默认情况下不允许第三方 cookie。即使您添加了“Samesite”,会话 ID 也不会通过 cookie 传递。当它无法通过时,浏览器将再次重试,因此您会看到创建了多个会话。起初,我认为这是服务器端错误,因为它看起来像日志中的无限循环。

当您在视图函数中调用 request.session 时,Django 默认会创建一个 cookie 存储 sessionid。此 cookie 仅在您使用 request.session 时创建。如果您不使用 request.session,应用程序可以毫无问题地加载。但是完全不使用 session 几乎是不可能的。甚至示例 shopify django 应用程序也在使用会话。

我认为可能的方法是更改会话中间件。通过Shopify 开发人员的回复,我知道我们可以使用负载中的 shop (dest) 和 user (sub) 字段来创建唯一的 ID 并根据该 ID 存储您的会话数据。只需自定义默认会话中间件,删除 request.cookies 并使用此 ID 作为会话密钥。应该没问题。

就我个人而言,由于工作量太大,我没有更改这个中间件。完成会话令牌身份验证后,我发现在测试人员进行应用程序审查期间会话无法持续。如果您可以实现App Bridge、会话令牌身份验证并更新默认的 django 会话,您就可以持久化会话数据。

IMO,独立应用程序可能是 Python / Django 开发人员的更好选择。如果有人有更简单的方法,请告诉我。我很想在没有任何具体例子的情况下研究所有这些。


查看完整回答
反对 回复 2021-07-06
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信