如何从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:
- 在
settings.py里添加你的API域名到可信源:
CSRF_TRUSTED_ORIGINS = ["https://your-react-native-api-domain.com"]
- 针对移动端调整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




