在第三方站点的 iframe 中访问时,未为子域设置 Django csrf cookie

Django csrf cookie not set for sub domain when accessed in iframe on third party site

到目前为止,我的应用运行良好,所有操作都是通过访问其 public IP 完成的。

现在,它被添加到主站点,作为 app.mainsite.com。 它是可以访问的。我可以登录等等。

但我的应用程序有点特别,它的某个功能允许其用户在任何第三方网站的 iframe 中打开其 URL 之一,该应用程序的脚本嵌入 html,在这些第三方网站上做一些特定于应用程序的 activity。现在,每个人都可以看到该应用程序为那些第三方网站带来的新内容,但要更改一些有关如何更改的设置,必须登录到我的应用程序。如果没有,一个人将被重定向到模态本身,如果登录成功,他们将被重定向到设置编辑页面。基本上,来自第三方网站的任何写入请求都需要网站所有者登录到我们的应用程序。他们可以在模式中登录,或者从另一个选项卡登录,然后刷新他们的站点以进入编辑视图。

问题是,早些时候,一切都很完美。 现在,我可以使用来自 app.mainsite.com 的 csrf 标记来形成 post,但是当它在 iframe 中打开时,它会抛出 CSRF cookie not set.

我检查了“资源”选项卡,在该选项卡下,app.mainsite.com 中的 csrftoken 与表单中的 csrfmiddlewaretoken 不匹配。 显然,CSRF 失败了。

我该如何克服这个问题?

我试过设置 CSRF_COOKIE_DOMAIN='.mainsite.com' 但没用。

我能做什么?

您可以尝试在提供响应的视图周围添加 @csrf_exempt 装饰器...但是当然,这将禁用 CSRF 验证...

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def your_view(request):
    ...

Turned out, it was a bug in the Ubuntu build of Chromium. 是的,我正在使用 Chromium(并且我使用 Ubuntu 作为我的 OS)那个人在问题中提供的 plnkr link,它没有'不能在 Chromium 中工作。但它在 Chrome 和 Firefox

中运行良好

也在 Chrome 和 Firefox 中测试了我的应用程序;像以前一样工作。