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

时间:2018-10-03 22:41:56

标签: python django shopify shopify-app

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您的方法不再有效。谷歌将很快禁止 3rd 方 cookie,而 Firefox 和 Safari 已经这样做了。新应用需要实施 session token authentication,因为第三方 cookie 不会很快生效。

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

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

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

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

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