我使用Django Rest Framework
和django-rest-auth
。
我有标准的API端点(/login,/logout,/registration...)
使用我的浏览器,我可以登录/列出我的用户/注销。使用Insomnia(一个API请求程序),我无法登录/注销,我有错误
“CSRF失败:CSRF令牌丢失或不正确”
也许我需要添加CSRF头,但老实说,我不知道在哪里可以找到这个CSRF令牌...也许我需要添加一些东西(@csrf_protect
?)到登录端点,但我是否必须完全重写默认视图?
4条答案
按热度按时间smdnsysy1#
您需要在Insomnia(https://support.insomnia.rest/article/49-cookies)的Header设置中设置X-CSRFToken。
1.转到Insomnia中的标题设置
1.添加新条目
X-CSRFToken
1.搜索或
cookie
,点击Request => Cookie
1.再次单击
Request => Cookie
1.在Cookie名称中键入
csrftoken
1.单击完成
再试一次
CSRF Token由Django在cookie中设置。这在对服务器的第一个请求中完成。然后,cookie的值作为X-CSRF-Token发送回header内的服务器。
你可以在浏览器的调试器中看到发生了什么(Chrome中的F12)
csrftoken Cookie设置为
csrftoken作为X-CSRF-Token发送回请求报头
中的服务器
j5fpnvbx2#
因为名声不好而作为回答而不是评论提及。
添加一个名为
X-CSRFTOKEN
的条目就可以了。但要做到这一点,请确保您有一些不需要csrftoken的URL并发出请求。该解决方案只有在向API发出成功请求后才能起作用,否则Insomnia无法从服务器获得令牌,并且会出现No cookies in store for URL
错误。nszi6y053#
除了@basti500的回答。
使用X-CSRFTOKEN而不是X-CSRFToken与Django的默认CSRF_HEADER_NAME(
HTTP_X_CSRFTOKEN
)一起工作。即:
1.转到Insomnia中的标题选项卡
1.添加新条目
X-CSRFTOKEN
1.搜索vor cookie,点击
Request => Cookie
1.再次单击
Request => Cookie
1.在Cookie名称中键入
csrftoken
1.单击完成
确保检查是否在Django的www.example.com中设置了CSRF_HEADER_NAMEsettings.py
vzgqcmou4#
Basti500的回答对我很有效。但它给了我一个
405 Method Not Allowed
我错误地在端点的末尾添加了一个
/
,只要删除它就可以了,没有任何额外的头。