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

11

我正在使用 Django Rest Framework,同时也在使用 django-rest-auth

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

通过浏览器,我可以登录/列出我的用户/退出。但通过 Insomnia(一个API请求工具),我无法登录/退出,出现了以下错误:

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

也许我需要添加CSRF头部,但我真的不知道如何找到这个CSRF令牌……也许我需要在登录端点中添加一些东西(@csrf_protect?),但是我必须完全重写默认视图吗?

5个回答

21

解决方案

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

  1. 转到Insomnia的Header设置
  2. 新增一个名称为X-CSRFToken的条目
  3. 搜索cookie,点击Request => Cookie
  4. 再次点击Request => Cookie
  5. 在Cookie Name输入csrftoken
  6. 点击完成

然后再次尝试即可。

如何使用Django、Rest和Insomnia解决"CSRF Failed: CSRF token missing or incorrect"

说明

Django在cookie中设置CSRF Token。这是在向服务器发送第一个请求时完成的。然后将cookie的值作为X-CSRF-Token在header中发送回服务器。

您可以在浏览器的调试器中(Chrome中按F12键)查看正在发生的事情。

  1. 设置csrftoken Cookie enter image description here

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


2

因为声望低,所以将其作为答案而不是评论提及。

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


谢谢。这实际上为我节省了一些时间 :) - Rafael Santos

1

除了 @basti500 的回答。

使用 X-CSRFTOKEN 而不是 X-CSRFToken 可以与 Django 的默认CSRF_HEADER_NAME配合使用,即 HTTP_X_CSRFTOKEN

也就是说:

  1. 在 Insomnia 中前往头部标签页
  2. 添加一个新的条目 X-CSRFTOKEN
  3. 搜索 cookie,点击 请求 => Cookie
  4. 再次点击 请求 => Cookie
  5. csrftoken 输入至 Cookie 名称中
  6. 点击完成

确保检查设置文件 settings.py 中是否设置了 CSRF_HEADER_NAME。


0

basti500的回答对我有效。但是它给了我一个405方法不允许

我错误地在我的终点添加了一个/,只需移除它对我而言就可以正常工作,无需任何额外的头部信息。


0
如果你只是在使用Django作为Web服务器和Insomnia(或Postman),而偶然来到这里,那么我来告诉你如何获取CSRF令牌。
创建一个端点:
from django.views.decorators.csrf import get_token

urlpatterns = [
    # ...other URL patterns...
    path('api/csrf-token/', get_token, name='api-csrf-token'),
]

启动您的Django服务器并向/api/csrf-token/发出请求。该请求将在响应中返回CSRF令牌。
从cookie响应中复制CSRF令牌。
在Insomnia中:
打开您的请求或创建一个新的请求。 转到“Headers”选项卡。 添加一个名为“X-CSRFToken”的新标头,并将CSRF令牌值粘贴为标头值。 发送您的请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接