来自 Google Web Toolkit 的 Django 1.2 CSRF 和 HTTP 帖子

发布于 2024-09-24 02:32:26 字数 380 浏览 7 评论 0原文

我有一个与 Django 服务器端配合使用的 GWT Web 应用程序。我最近将 Django 升级到 1.2,但无法从我的 GWT 应用程序获取 HTTP 帖子。我收到此错误:

CSRF 验证失败。要求 已中止。

失败原因:

CSRF 令牌丢失或不正确。

我已经启用了 csrf 中间件('django.middleware.csrf.CsrfViewMiddleware'、'django.middleware.csrf.CsrfResponseMiddleware'),它适用于登录等贡献应用程序,但似乎令牌不是添加到通过 GWT 发布的帖子中。有什么想法吗?提前致谢。

I have a GWT web app working with Django server-side. I recently upgraded Django to 1.2, and am not able to get HTTP posts to work from my GWT app. I am getting this error:

CSRF verification failed. Request
aborted.

Reason given for failure:

CSRF token missing or incorrect.

I have enabled the csrf middlewares ('django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfResponseMiddleware') which is working for contrib apps like login, but it seems as though the token is not getting added to posts made through GWT. Any ideas? Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

画▽骨i 2024-10-01 02:32:26

如果您检查了 auth.login 的模板,您会注意到 CSRF 令牌明确包含在

标记内。

<form method="post" action=".">
    {% csrf_token %}

当页面根据 GET 请求呈现时,该字段会扩展为隐藏字段。类似于:

<form method="post" action=".">
    <div style='display:none'>
        <input type='hidden' name='csrfmiddlewaretoken' 
             value='90064bf0e86edacfdb60595e3e2b8f23' />
    </div>

然后,此令牌在 POST传回视图并进行验证。

因此,在 POST 到受 CSRF 保护的视图之前,您必须首先从该视图获取令牌。

在向视图发出 POST 请求之前,您能否验证/确保您手头有 CSRF 令牌?或者,您可以使用 禁用视图的 CSRF 保护csrf_exempt 装饰器。但这可能不是一个好主意。

更新

这就是我的问题的要点:我的前端没有使用 django 模板,因此我无法使用令牌标记表单。我在前端使用 GWT,它正在渲染帖子的表单。

在渲染页面之前,您是否已向 Django 视图发出 GET 请求?在这种情况下,您可以通过解析响应的内容来获取 CSRF 令牌。

如果没有,您将必须向视图显式发出 GET 请求(假设它支持 GET)并解析 CSRF 令牌的响应。有关示例,请参阅此问题

If you have checked the templates for auth.login you'll notice that a CSRF token is explicitly included inside the <form> tag.

<form method="post" action=".">
    {% csrf_token %}

This is expanded into a hidden field when the page is rendered on a GET request. Something like:

<form method="post" action=".">
    <div style='display:none'>
        <input type='hidden' name='csrfmiddlewaretoken' 
             value='90064bf0e86edacfdb60595e3e2b8f23' />
    </div>

This token is then passed back to the view on POST and validated.

Consequently before you can POST to a CSRF protected view you will have to first get the token from the said view.

Can you verify/ensure that you have the CSRF token handy before making a POST request to the view? Alternately you can disable CSRF protection for the view using the csrf_exempt decorator. This may not be a good idea though.

Update

This is the point of my question: I am not using django templates for my front-end and thus I cannot tag forms with the token. I am using GWT for my front-end, which is rendering the form for the post.

Are you already making a GET request to the Django view before rendering the page? In that case you can get the CSRF token by parsing the contents of the response.

If not you will have to explicitly make a GET request to the view (assuming it supports GET) and parse the response for a CSRF token. For an example see this question.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文