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

时间:2019-04-25 09:37:55

标签: django django-rest-framework django-rest-auth

我正在使用Django Rest Frameworkdjango-rest-auth

我有标准的API端点(/ login,/ logout,/ registration ...)

使用浏览器,我可以登录/列出用户/注销。 使用Insomnia(API请求者),我无法登录/注销,出现错误

  

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

也许我需要添加CSRF标头,但是老实说,我不知道在哪里可以找到该CSRF令牌...也许我需要添加一些内容(@csrf_protect?)来登录端点,但是我是吗?被迫完全重写默认视图?

3 个答案:

答案 0 :(得分:1)

由于声誉低,所以作为答案而不是评论提及。

添加名为 X-CSRFTOKEN 的条目有效。但是要让它起作用,请确保您有一些不需要 csrftoken 的 url 并提出请求。该解决方案只有在向 API 发出成功请求后才会起作用,否则 Insomnia 无法从服务器获取令牌并出现 No cookies in store for URL 错误。

答案 1 :(得分:0)

解决方案

您需要在Insomnia(https://support.insomnia.rest/article/49-cookies的标题设置中设置X-CSRFToken )。

  1. 转到失眠的标题设置
  2. 添加新条目X-CSRFToken
  3. 搜索cookie,然后点击Request => Cookie
  4. 再次单击Request => Cookie
  5. 在Cookie名称中输入csrftoken
  6. 点击完成

,然后重试。

How to solve "CSRF Failed: CSRF token missing or incorrect" with Django, Rest and Insomnia

说明

CSRF令牌由Django在Cookie中设置。这是在对服务器的第一个请求中完成的。然后,cookie的值将以X-CSRF-Token的形式发送回堆中的服务器。

您可以在浏览器的调试器(Chrome中为F12)中查看发生了什么

  1. csrftoken Cookie已设置 enter image description here

  2. csrftoken作为X-CSRF-Token发送回请求标头中的服务器 enter image description here

答案 2 :(得分:0)

除了@ basti500的答案。

  

使用X-CSRFTOKEN代替X-CSRFToken可与Django的默认值一起使用   CSRF_HEADER_NAME是HTTP_X_CSRFTOKEN

也就是说:

  1. 转到失眠的标题标签
  2. 添加新条目X-CSRFTOKEN
  3. 搜索vor cookie,单击Request => Cookie
  4. 再次单击Request => Cookie
  5. 在Cookie名称中输入csrftoken
  6. 点击完成

确保检查Django的settings.py中是否设置了CSRF_HEADER_NAME

相关问题