You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从Django Rest Framework后端获取csrftoken并传入React Native前端?

解决React Native调用Django API获取CSRF Token的问题

嘿,这个问题我之前帮不少开发者踩过坑——React Native因为没有浏览器的自动Cookie管理机制,确实没法像Web端那样直接拿到Django的csrftoken,但咱们有几个既安全又实用的方案,完美适配移动端+Web端共用后端的场景:

方案1:新增专门的CSRF Token获取接口

这是最直接也最推荐的方式,给移动端单独开一个接口来获取csrftoken,同时让Django把token写入Cookie(方便后续请求自动携带,或者直接返回token值)。

Django端实现

在你的app里新增一个视图函数:

from django.middleware.csrf import get_token
from django.http import JsonResponse

def fetch_csrf_token(request):
    # 生成或获取当前请求的CSRF Token
    csrf_token = get_token(request)
    # 返回Token的同时设置Cookie,适配React Native的Cookie管理
    response = JsonResponse({"csrf_token": csrf_token})
    response.set_cookie(
        key="csrftoken",
        value=csrf_token,
        max_age=31449600,  # 和Django默认有效期一致(1年)
        httponly=False,  # 必须设为False,让React Native能读取Cookie
        secure=request.is_secure(),  # 生产环境HTTPS下设为True
        samesite="None"  # 跨域场景下设为None,允许移动端携带Cookie
    )
    return response

然后在项目的urls.py里配置路由:

path("api/csrf-token/", fetch_csrf_token, name="fetch_csrf_token")

React Native端实现

先调用这个接口获取Token,之后所有需要CSRF验证的请求(POST/PUT/DELETE)都带上X-CSRFToken请求头:

import CookieManager from '@react-native-cookies/cookies';

// 初始化获取CSRF Token
async function getCsrfToken() {
  await fetch("https://your-django-api.com/api/csrf-token/", { method: "GET" });
  const cookies = await CookieManager.get("https://your-django-api.com");
  return cookies.csrftoken?.value;
}

// 示例POST请求
async function submitData(data) {
  const csrfToken = await getCsrfToken();
  const response = await fetch("https://your-django-api.com/api/submit/", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-CSRFToken": csrfToken,
    },
    body: JSON.stringify(data),
  });
  return response.json();
}

方案2:调整Django CSRF配置适配移动端

如果你的移动端已经通过Session或JWT完成了用户认证,可以微调Django的CSRF设置,让移动端能正常携带Cookie:

  1. settings.py里添加你的API域名到可信源:
CSRF_TRUSTED_ORIGINS = ["https://your-react-native-api-domain.com"]
  1. 针对移动端调整Cookie属性:
CSRF_COOKIE_SAMESITE = "None"  # 允许跨域携带Cookie
CSRF_COOKIE_SECURE = True  # 生产环境强制HTTPS
CSRF_COOKIE_HTTPONLY = False  # 允许React Native读取Cookie

这样当React Native第一次发起GET请求(比如登录接口)时,Django会自动设置csrftoken Cookie,之后你可以用Cookie管理库提取并在请求头中携带。

安全注意事项

  • 绝对不要随便给视图加@csrf_exempt,除非是完全公开的只读接口,否则会引入严重的CSRF漏洞
  • 生产环境必须启用HTTPS,防止Cookie被中间人劫持
  • 如果使用JWT认证,建议同时保留CSRF保护,尤其是你的后端还服务Web端的情况下

内容的提问来源于stack exchange,提问作者Yash Mittra

火山引擎 最新活动