我正在尝试在两个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))
我做错了什么? 感谢
答案 0 :(得分:1)
尝试定义你的上下文并像这样返回......
context = RequestContext(request, {
'request': request
})
return render_to_response(..., context_instance=context)
答案 1 :(得分:1)
这是设计使然,不允许跨站点POST执行。根据django文档,您可以选择将您希望能够执行的方法标记为安全:
答案 2 :(得分:0)
我无法以你的方式解决它,但我知道如何做到这一点:
C通过javascript打开一个弹出窗口直接转到S:
window.open("http://<S_address>/<path_to_request_form>");
通过这种方式,使用通过第三方认证服务器记录的C的用户(我之前忘了提及,对不起)仍然记录在S的弹出窗口中,并使用正确的csrf令牌接收其中的表单。我不知道它是否正确但是有效。 谢谢你的时间