React Native升级至0.72.6后与Django 3.1.2的CSRF 403问题排查
React Native升级引发CSRF Token 403错误的可能原因
1. AsyncStorage 模块迁移导致旧Token读取失败
RN 0.69版本开始,官方移除了核心库自带的AsyncStorage,将其移至社区维护的@react-native-async-storage/async-storage包。如果旧版本(apk_1)使用的是import AsyncStorage from 'react-native'这种导入方式,升级到0.72.6后该路径已失效——要么读取不到任何数据,要么读取的是新存储模块的空数据。此时请求携带的旧Token(或无Token)与Django当前Session对应的CSRF Token不匹配,直接触发403。
2. Networking模块的Cookie处理逻辑变更
RN 0.68至0.72版本间,对Networking模块的Cookie管理做了多处调整:
- 默认Cookie存储位置或机制改变,升级后原Session Cookie丢失,Django为新Session生成全新CSRF Token,与AsyncStorage中存储的旧Token脱节。
- 部分版本优化了
Set-Cookie头的解析/存储逻辑,导致Cookie中的csrftoken未被正确同步,AsyncStorage的Token与当前有效Token不匹配。
3. 网络安全策略收紧
RN 0.70+版本默认加强了网络安全配置,比如对Cookie的SameSite属性处理更严格。Django 3.1.2默认CSRF Cookie的SameSite值为Lax,RN升级后网络层对跨站请求的Cookie携带规则更严格,可能导致CSRF Cookie无法正确传递到后端。后端无法通过Cookie获取CSRF Token,也就无法验证请求头里的Token,返回403。
验证建议
- 检查AsyncStorage导入方式:确认是否已切换到
@react-native-async-storage/async-storage,同时验证读取到的Token是否与Django当前返回的csrftoken一致。 - 排查请求头与Cookie:在Axios中开启日志,确认请求是否携带了正确的Session Cookie和
X-CSRFToken头,两者是否匹配。 - 临时测试:清空AsyncStorage,重新从Django返回的Cookie中获取CSRF Token并存入,再发起请求,观察是否仍出现403。
内容的提问来源于stack exchange,提问作者rao
相关产品推荐
相关产品推荐

