一尘不染

CSRF失败:CSRF令牌丢失或不正确

django

我正在使用Django 1.7和django-rest-framework。

我制作了一个API,该API返回了一些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时,我得到:

--------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将设置包括在内…

我不知道是怎么回事。有人知道这个问题是什么吗?


阅读 1314

收藏
2020-03-30

共1个答案

一尘不染

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

在Django文档提供了检索CSRF令牌使用jQuery和请求发送它的更多信息。CSRF令牌另存为一个cookie csrftoken,你可以从HTTP响应中检索该cookie,该cookie 随所使用的语言而异。

如果你无法检索CSRF cookie,通常表明你不应该使用SessionAuthentication。我建议根据你的需要研究TokenAuthentication或OAuth 2.0。

2020-03-30