通过 API 的 Django 身份验证

Django Authentication through API

我想提供一些API比如通过ReactJS接口登录和注销。我看到 Django 文档 here accounts/ 提供了一些 url,例如登录和注销。是否有可能我只是利用 accounts/ 下的登录和注销 api 而无需创建模板并在 Postman 中试用它们?我尝试使用 POST 请求:

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

和带有 csrfmiddlewaretoken 和 csrftoken 的 cookie 但出现错误 Forbidden (CSRF token missing or incorrect.): /accounts/login/

至于使用in-built Django 表单进行身份验证,不能通过传递JSON 数据来完成。相反,最好创建自己的 API 端点和 return 客户端的某种身份验证令牌以用于将来的请求。在这种情况下,您可能不需要 CSRF 令牌。

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


至于注入 CSRF 令牌,当您使用 ReactJS 时,有几种不同的方法可以做到这一点

在 React/Axios

中处理 CSRF 令牌

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

  1. 您可以在每个 Axios 调用的 header 中手动附加 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 store中设置CSRF token了