繁体   English   中英

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

[英]Django iframe: sessionkey being created every request

我有一个用 Django 构建的 shopify 应用程序,直到最近它都运行良好。 会话不会在每个请求中持续存在,因此会引发异常,因为在前一个请求中设置的给定密钥的会话不存在。 在 Shopify 之外尝试应用程序端点工作正常,会话在请求之间完美地持续存在,因此这绝对是 Shopify 中的一个问题。

查看数据库中的会话表,我们看到多个会话密钥具有相同的数据,这表明每个请求正在创建另一个会话。 我们如何在 iframe 中跨请求保持会话?

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

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

你的方法不再奏效。 谷歌将很快禁止 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 开发人员的更好选择。 如果有人有更简单的方法,请告诉我。 我很想在没有任何具体例子的情况下研究所有这些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM