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

时间:2018-03-15 11:26:50

标签: python django

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 个答案:

答案 0 :(得分:2)

鉴于django文档中的这个QA,您可以看到默认情况下框架使用 Double Submit Cookie 方法(而不是同步器 pattern)。

这种方法不要求服务器存储CSRF令牌,因为它唯一的检查是将cookie中的令牌与头(或参数)中的令牌进行比较并验证它们是否相等。

另一方面,同步器模式确实将CSRF令牌存储在服务器中的某个位置,并且对于每个请求,它通过将其与通过该服务器发送的令牌进行比较来验证其有效性。标题(或之前,在POST参数中)。

您可以详细了解这两种方法here

我猜您正在使用Web服务测试应用程序测试您的API,在这种情况下,您在请求中的某个位置缺少第二个令牌。

This section说明了如何为AJAX来电放置令牌:

  

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

看到您的上述请求,因此您应该放置此标头(当然具有当前令牌的值):

X-CSRFToken: z53lKL0f7VHkilYS5Ax8FMaQCU2ceouje9OeTJOgTy4gH0UgHVltAlOe2KFNNNB6