【发布时间】:2017-11-08 11:34:33
【问题描述】:
我的应用程序使用 django rest_framework 和 SessionAuthentication。我可以成功登录并在 cookie 中设置会话 ID 和 csrf 令牌。但是,POST 请求仍然会报 CSRF 失败。
- 使用 rest_framework BasicAuthentication 登录;会话 id 和 csrf 令牌设置为 cookie
- 将 csrf 令牌值复制并粘贴到带有键“X-CSRFTOKEN”的 Post 请求标头和来自 cookie 的值。
- django.middleware.csrf.CsrfViewMiddleware 在 settings.py 中的 Middleware 类中
我用 Postman 测试并得到了
{"detail":"CSRF 失败:CSRF 令牌丢失或不正确。"}
class ApiLoginView(APIView):
authentication_classes = (BasicAuthentication, )
permission_classes = (IsAuthenticated,)
def post(self, request, *args, **kwargs):
# use django.contrib.auth.login
login(request, request.user)
user = request.user
return Response("login success")
class ApiUserView(APIView):
authentication_classes = (SessionAuthentication,)
permission_classes = (IsAuthenticated,)
def post(self, request):
return Response("ApiUser Post Success")
Postman 是正确的测试工具吗? this seems to be a similar problem in Postman
我缺少什么吗?以及我测试 django_rest_framework 的选项是什么。
抱歉,这似乎是一个常见问题,但我在阅读相关帖子后无法找到解决方法。
【问题讨论】:
-
试试清除cookies!在 DRF 中默认免除 csrf。但是如果在 Cookies 中找到了 csrf 令牌,邮递员会包含该令牌,因此该错误。登录后可能会清除cookie并进行后调用。还要检查没有 csrf 的 curl。它可能有效...
-
@RajaSimon DRF 在使用会话身份验证时显式检查 CSRF 令牌。如果您不使用令牌,DRF肯定会拒绝该请求。
-
几天前我遇到了这个问题。您需要一个有效的推荐人。该错误有时可能会产生误导。
-
@RajaSimon 我从 cookie 中删除了 csrf 令牌,但 POST 请求仍然不起作用。据我了解,DRF 会话身份验证检查 CSRF。并且 CSRF 在请求头和 cookie 值之间比较 csrf token 的值。我们需要 cookie 和 header 中的 csrf 令牌才能使其工作。对吗?
-
@WilliamR.Marchand 谢谢。如何在 Postman 中设置正确的引用者?您能否分享一下如何在 Postman 或其他 API 测试平台中绕过它?
标签: django django-rest-framework postman