在Django数据库中,csrftoken存储在哪里?

7

csrftoken 存储在哪里?

当我访问一个 API 端点(注销 API,不需要参数)时:

POST /rest-auth/logout/ HTTP/1.1
Host: 10.10.10.105:8001
Connection: keep-alive
Content-Length: 0
Accept: application/json, text/plain, */*
Origin: http://localhost:8080
Authorization: Token 0fe2977498e51ed12ddc93026b08ab0b1a06a434
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36
Referer: http://localhost:8080/register
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: sessionid=b95zopro0qvkrexj8kq6mzo1d3z2hvbl; csrftoken=z53lKL0f7VHkilYS5Ax8FMaQCU2ceouje9OeTJOgTy4gH0UgHVltAlOe2KFNNNB6 

标题在上方。在响应中我得到了一个错误:
{"detail":"CSRF Failed: CSRF token missing or incorrect."}

因此,后端必须验证csrftoken
在后端数据库中,我找不到csrftoken字段:
enter image description here
所以我想知道它在加密的session_data中保存在哪里?

1
默认情况下,CSRF令牌存储在cookie中,而不是数据库中。如果你想将它存储在会话数据中,你可以设置CSRF_USE_SESSIONS - solarissmoke
但是如果后端不存储csrftoken,它如何验证它? - user7693832
2
你不能这样做。请参考 https://docs.djangoproject.com/en/2.0/ref/csrf/#is-it-a-problem-that-django-s-csrf-protection-isn-t-linked-to-a-session-by-default 。 - solarissmoke
如果你在DRF或任何API中,你可以排除csrf验证。 - Anup Yadav
1
你需要 csrf_token 做什么? - King Reload
@KingReload 现在,我想在前端获取 csrftoken 并将其设置为请求头 x-csrftoken:https://dev59.com/pqnka4cB1Zd3GeqPUtg8 - user7693832
1个回答

5
django文档中的QA部分,你可以看到该框架默认使用双重提交cookie方法(而不是同步器模式)。这种方法不需要服务器存储CSRF令牌,因为它唯一执行的检查是比较cookie中的令牌与标头(或参数)中的令牌并验证它们是否相等。同步器模式则在服务器中存储CSRF令牌,并在每个请求中通过将其与在标头(或与以前的POST参数中)发送的值进行比较来验证其有效性。你可以在这里阅读有关这两种方法的更多信息。
我猜您正在使用Web服务测试应用程序测试API,在这种情况下,您可能错过了请求中的第二个令牌。在此部分中,介绍了如何为AJAX调用放置令牌:

AJAX 虽然上述方法可用于AJAX POST请求,但它有一些不便之处:您必须记住在每个POST请求中作为POST数据传递CSRF令牌。因此,有一种替代方法:在每个XMLHttpRequest上,将自定义X-CSRFToken标头设置为CSRF令牌的值。这通常更容易,因为许多JavaScript框架提供了允许在每个请求上设置标头的钩子。

因此,根据您上面的请求,您应该放置此标头(当然是具有当前令牌值的标头):
X-CSRFToken: z53lKL0f7VHkilYS5Ax8FMaQCU2ceouje9OeTJOgTy4gH0UgHVltAlOe2KFNNNB6

请看我的这篇帖子:https://dev59.com/pqnka4cB1Zd3GeqPUtg8。我无法获取Cookies的 csrftoken。我不知道为什么。 - user7693832

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