两个Django Web应用程序之间的Csrf令牌验证失败

时间:2012-09-24 16:04:15

标签: django post csrf

我正在尝试在两个Web应用程序之间传递csrf令牌,以便将一个POST数据发送给另一个。 “客户端”应用程序(C)通过GET操作向csrf令牌询问“服务器”应用程序(S)。

S用以下形式回复C:

<form id='csrfRequestForm' name='csrfForm' action='http://{{ context_path }}/ajax/getcsrf' method='post'>
  <!-- csrf token -->
  {% csrf_token %}
  <!-- datas to POST follow -->
  ...
</form>

C必须将此表单提交给操作(映射到S使用的URL)才能将数据发送到S. 当C尝试这样做时,csrf验证失败。我检查了GET的结果,并收到了表单中的csrf令牌。我在django.middleware.csrf.CsrfViewMiddleware的MIDDLEWARE CLASSES下列出了settings.py个关键字,并在使用RequestContext呈现表单的视图时传递了render_to_response(... RequestContext(request))

我做错了什么? 感谢

3 个答案:

答案 0 :(得分:1)

尝试定义你的上下文并像这样返回......

context = RequestContext(request, {
  'request': request
})

return render_to_response(..., context_instance=context)

答案 1 :(得分:1)

这是设计使然,不允许跨站点POST执行。根据django文档,您可以选择将您希望能够执行的方法标记为安全:

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

答案 2 :(得分:0)

我无法以你的方式解决它,但我知道如何做到这一点:

C通过javascript打开一个弹出窗口直接转到S:

window.open("http://<S_address>/<path_to_request_form>");

通过这种方式,使用通过第三方认证服务器记录的C的用户(我之前忘了提及,对不起)仍然记录在S的弹出窗口中,并使用正确的csrf令牌接收其中的表单。我不知道它是否正确但是有效。 谢谢你的时间