Django iframe:每次请求都会创建会话密钥

Django iframe: sessionkey being created every request

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

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

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

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

你的方法不再奏效了。 Google 将很快禁止第 3 方 cookie,而 firefox 和 Safari 已经这样做了。需要新的应用程序才能实现 session token authentication,因为第三方 cookie 不会很快运行。

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

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

我认为可能的方法是更改​​会话中间件。使用 the reply from Shopify developer, I know that we can use the shop (dest) and user (sub) fields from the payload to create a unique id and store your session data based on that id. Just customize the default session middleware,删除 request.cookies 并使用此 ID 作为会话密钥。应该没问题。

我个人没有改这个中间件,因为工作量太大了。完成会话令牌授权后,我发现在测试人员进行应用审查期间会话无法持续。如果你能实现App Bridge,session token auth和更新默认的django session,你就可以持久化session数据。

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