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

lymgl2op  于 2023-06-25  发布在  Go
关注(0)|答案(4)|浏览(182)

我使用Django Rest Frameworkdjango-rest-auth
我有标准的API端点(/login,/logout,/registration...)
使用我的浏览器,我可以登录/列出我的用户/注销。使用Insomnia(一个API请求程序),我无法登录/注销,我有错误
“CSRF失败:CSRF令牌丢失或不正确”
也许我需要添加CSRF头,但老实说,我不知道在哪里可以找到这个CSRF令牌...也许我需要添加一些东西(@csrf_protect?)到登录端点,但我是否必须完全重写默认视图?

smdnsysy

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)

  1. csrftoken Cookie设置为

  2. csrftoken作为X-CSRF-Token发送回请求报头

    中的服务器

j5fpnvbx

j5fpnvbx2#

因为名声不好而作为回答而不是评论提及。
添加一个名为X-CSRFTOKEN的条目就可以了。但要做到这一点,请确保您有一些不需要csrftoken的URL并发出请求。该解决方案只有在向API发出成功请求后才能起作用,否则Insomnia无法从服务器获得令牌,并且会出现No cookies in store for URL错误。

nszi6y05

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

vzgqcmou

vzgqcmou4#

Basti500的回答对我很有效。但它给了我一个405 Method Not Allowed
我错误地在端点的末尾添加了一个/,只要删除它就可以了,没有任何额外的头。

相关问题