我想提供一些API,例如通过ReactJS接口进行登录和注销。我看到了Django文档here,该文档说明了/提供了一些URL,例如登录和注销。是否有可能我仅使用account /下的登录和注销api而不创建模板并在Postman中尝试它们?我尝试了POST请求:
{
"username": "admin",
"password": "admin"
}
以及具有csrfmiddlewaretoken和csrftoken的Cookie,但出现错误Forbidden (CSRF token missing or incorrect.): /accounts/login/
答案 0 :(得分:1)
对于使用内置的Django表单进行身份验证,无法通过传递JSON数据来完成。相反,最好创建自己的API端点,并将某种身份验证令牌返回给客户端以用于将来的请求。在这种情况下,您可能不需要CSRF令牌。
或者,您可以将您的react应用程序托管在Django页面中,并使用Django进行身份验证,在这种情况下,您不需要处理令牌,因为Django会为您处理。但这不是一种很常见的方法,可能并非在所有情况下都有效。
关于注入CSRF令牌,当您使用ReactJS时有几种不同的方法
对于Axios客户端,您有三个选择:
在这里,您无需任何进一步配置即可简单地将CSRF令牌与Axios结合使用:
import axios from 'axios';
axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = 'X-CSRFToken'
fetch(url, {
credentials: 'include',
method: 'POST',
mode: 'same-origin',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRFToken': csrftoken
},
body: {}
})
}
如果您使用Redux管理应用程序状态,则可以使用redux-csrf处理Redux中的CSRF令牌。
您可以通过以下方式首先从npm安装它:
npm install redux-csrf --save
然后,您可以使用setCsrfToken(token)
API在Redux存储中设置CSRF令牌。