我正在使用Django Rest Framework
和django-rest-auth
。
我有标准的API端点(/ login,/ logout,/ registration ...)
使用浏览器,我可以登录/列出用户/注销。 使用Insomnia(API请求者),我无法登录/注销,出现错误
“ CSRF失败:CSRF令牌丢失或不正确”
也许我需要添加CSRF标头,但是老实说,我不知道在哪里可以找到该CSRF令牌...也许我需要添加一些内容(@csrf_protect
?)来登录端点,但是我是吗?被迫完全重写默认视图?
答案 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 )。
X-CSRFToken
cookie
,然后点击Request => Cookie
Request => Cookie
csrftoken
,然后重试。
说明
CSRF令牌由Django在Cookie中设置。这是在对服务器的第一个请求中完成的。然后,cookie的值将以X-CSRF-Token的形式发送回堆中的服务器。
您可以在浏览器的调试器(Chrome中为F12)中查看发生了什么
答案 2 :(得分:0)
除了@ basti500的答案。
使用X-CSRFTOKEN代替X-CSRFToken可与Django的默认值一起使用 CSRF_HEADER_NAME是
HTTP_X_CSRFTOKEN
。
也就是说:
X-CSRFTOKEN
Request => Cookie
Request => Cookie
csrftoken
确保检查Django的settings.py中是否设置了CSRF_HEADER_NAME