到目前为止,我的应用程序运行良好,所有操作都是通过访问其公共(public) IP 来完成的。
现在,它已添加到主站点,名称为 app.mainsite.com。 这样就可以访问了。我可以登录等等,一切都可以。
但我的应用程序有点特别,它的某个功能允许用户在应用程序脚本嵌入 html 的任何第三方网站上的 iframe 中打开其 URL 之一,以执行一些应用程序特定的事件在那些第三方网站上。现在,每个人都可以看到该应用程序为第三方网站带来的新内容,但要更改一些设置,必须登录我的应用程序。如果没有,用户将被重定向到模式本身内部,如果登录成功,他们将被重定向到设置编辑页面。基本上,来自第三方网站的任何写入请求都需要网站所有者登录我们的应用程序。他们可以在模式内登录,或者从另一个选项卡登录,然后刷新其网站以便能够进入编辑 View 。
问题是,早些时候,一切都很完美。
现在,我可以使用 app.mainsite.com 中的 csrf token 进行表单发布,但是当它在 iframe 中打开时,它会抛出 CSRF cookie not set
。
我检查了“资源”选项卡,在该选项卡下,app.mainsite.com 中的 csrftoken
与表单中的 csrfmiddlewaretoken
不匹配。
显然,CSRF 失败了。
我该如何克服这个问题?
我尝试设置 CSRF_COOKIE_DOMAIN='.mainsite.com'
但不起作用。
我能做什么?
最佳答案
您可以尝试在提供响应的 View 周围添加 @csrf_exempt 装饰器...但是当然,这将禁用 CSRF 验证...
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def your_view(request):
...
关于在第三方网站的 iframe 中访问时,未为子域设置 Django csrf cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29559000/