通过API进行Django身份验证

时间:2019-01-31 07:26:33

标签: django django-authentication

我想提供一些API,例如通过ReactJS接口进行登录和注销。我看到了Django文档here,该文档说明了/提供了一些URL,例如登录和注销。是否有可能我仅使用account /下的登录和注销api而不创建模板并在Postman中尝试它们?我尝试了POST请求:

{
    "username": "admin",
    "password": "admin"
}

以及具有csrfmiddlewaretoken和csrftoken的Cookie,但出现错误Forbidden (CSRF token missing or incorrect.): /accounts/login/

1 个答案:

答案 0 :(得分:1)

对于使用内置的Django表单进行身份验证,无法通过传递JSON数据来完成。相反,最好创建自己的API端点,并将某种身份验证令牌返回给客户端以用于将来的请求。在这种情况下,您可能不需要CSRF令牌。

或者,您可以将您的react应用程序托管在Django页面中,并使用Django进行身份验证,在这种情况下,您不需要处理令牌,因为Django会为您处理。但这不是一种很常见的方法,可能并非在所有情况下都有效。


关于注入CSRF令牌,当您使用ReactJS时有几种不同的方法

在React / Axios中处理CSRF令牌

对于Axios客户端,您有三个选择:

  1. 您可以在每个Axios调用的标题中手动附加CSRF令牌
  2. 您可以为每次通话使用Axios xsrfHeaderName
  3. 您可以使用默认的xsrfHeaderName(axios.defaults.xsrfHeaderName =“ X-CSRFToken”)

在这里,您无需任何进一步配置即可简单地将CSRF令牌与Axios结合使用:

import axios from 'axios';

axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = 'X-CSRFToken'

在React / Fetch中处理CSRF令牌

fetch(url, {
    credentials: 'include',
    method: 'POST',
    mode: 'same-origin',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'X-CSRFToken': csrftoken
    },
    body: {}
   })
  }

使用React / Redux处理CSRF

如果您使用Redux管理应用程序状态,则可以使用redux-csrf处理Redux中的CSRF令牌。

您可以通过以下方式首先从npm安装它:

npm install redux-csrf --save

然后,您可以使用setCsrfToken(token) API在Redux存储中设置CSRF令牌。