1

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

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)才能将数据 POST 到 S。当 C 尝试这样做时,csrf 验证失败。我已经检查了 GET 的结果,并且表单中收到了 csrf 令牌。我django.middleware.csrf.CsrfViewMiddleware在 MIDDLEWARE CLASSES 下列出了关键字,settings.py并且RequestContext在使用render_to_response(... RequestContext(request))

我究竟做错了什么?谢谢

4

3 回答 3

1

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

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

return render_to_response(..., context_instance=context)
于 2012-09-24T16:25:48.087 回答
1

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

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

于 2012-09-24T17:44:33.893 回答
0

我无法以您的方式解决它,但我设法做到了:

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

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

这样,使用通过第三方身份验证服务器登录的 C 的用户(我之前忘了提,抱歉),仍然登录到 S 中的弹出窗口,并在其中接收带有正确 csrf 令牌的表单。我不知道它是否正确,但它有效。谢谢你的时间

于 2012-09-25T15:10:31.637 回答