2014-10-29 70 views
23

我正在使用Django 1.7和django-rest-framework。CSRF失败:CSRF令牌丢失或不正确

我做了返回我一些JSON数据把这个在我settings.py

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',), 
    'DEFAULT_RENDERER_CLASSES': (
    # 'rest_framework.renderers.XMLRenderer', 
    'rest_framework.renderers.JSONRenderer', 
    # 'rest_framework.renderers.BrowsableAPIRenderer', 
    ) 
} 

当我做GET调用,它返回我所有的数据,但是当我试图用PUT/PATCH我得到一个API:

--------Response Headers--------- 
Status Code: 403 
Date: Wed, 29 Oct 2014 18:51:42 GMT 
Vary: Cookie 
Server: WSGIServer/0.1 Python/2.7.8 
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS 
X-Frame-Options: SAMEORIGIN 
Content-Type: application/json 
--------------------------------- 

--------Response Body----------- 
{"detail": "CSRF Failed: CSRF token missing or incorrect."} 
--------------------------------- 

这只发生在我登录时,如果我是匿名的,我可以正确地PUT/PATCH。

我与@csrf_exempt试图和我的错误,我已经包括在设置中,rest_framework.permissions.AllowAny ...

我不知道发生了什么事情。有谁知道这个问题是什么?

回答

32

当您使用SessionAuthentication时,您使用的Django身份验证通常需要检查CSRF。 Django REST Framework仅对SessionAuthentication执行此操作,因此您必须在X-CSRFToken标头中传递CSRF标记。

Django documentation提供了更多关于使用jQuery检索CSRF令牌并在请求中发送CSRF令牌的信息。 CSRF令牌被保存为一个名为csrftoken的Cookie,您可以从HTTP响应中检索该响应,该响应取决于正在使用的语言。

如果您无法检索CSRF cookie,通常这表示您不应使用SessionAuthentication。我建议根据您的需要查看TokenAuthenticationOAuth 2.0

+1

我知道我应该给CSRF令牌,当我验证,但实际上我使用.NET Windows窗体应用程序与此API进行通信,并且它通过HTTPRequest和HTTPResponse方法进行GET调用,我不知道如何在这种情况下获得CSRF令牌,我不使用AJAX或HTML表单。 **编辑** .NET应用程序接收JSON格式的纯文本,并返回相同的 – 2014-10-29 20:54:54

+0

你没事,用cookie我可以处理csrftoken并将其放回到标题数据中,所以我可以使PUT/PATCH调用,如果我登录。谢谢! – 2014-10-30 19:14:34

+0

@AlexLordMordor您能解释一下您的解决方案吗?以及为什么当你是一个登录用户时它不工作,但以匿名方式工作。 (我有完全相同的问题) – 2015-03-30 04:59:28

0

我有类似的问题,我裹着我的网址下csrf_exempt方法 -

from django.views.decorators.csrf import csrf_exempt 

url(r'^api/v1/some-resource$', csrf_exempt(SomeApiView.as_view())), 
相关问题