Expo React Native应用access token存储:AsyncStorage与expo-secure-store选型
Expo 项目令牌存储选型及最优实践
核心选型结论
敏感认证类凭证必须优先选择 expo-secure-store,不要单独使用未加密的AsyncStorage存储access token、refresh token这类敏感数据,哪怕自行实现加密逻辑,可靠性也远低于系统级加密方案。
你提到的Redux适配问题不存在:Redux和存储层没有强绑定关系,只需对持久化逻辑做简单封装即可适配expo-secure-store,无需修改Redux业务代码。
双库搭配使用场景
两个库完全可以搭配使用,分别承载不同安全等级的存储需求:
- expo-secure-store 适用场景
- 存储access token、refresh token
- 存储生物认证凭证、支付密码摘要等用户私密信息
- 存储其他涉及用户隐私的敏感配置项
- AsyncStorage 适用场景
- 存储非敏感应用全局配置:主题偏好、语言设置、首次启动引导标记等
- 存储可公开的用户信息缓存:用户昵称、头像地址等
- 存储Redux中不需要加密的公共状态片段
结合Redux的最优实践
如果使用redux-persist做Redux状态持久化,可以拆分敏感和非敏感状态,分别对接不同存储层:
- 拆分Redux状态切片:将
auth(认证相关,包含token)和app(公共配置)分为两个独立的state切片 - 为
auth切片自定义适配expo-secure-store的存储适配器,示例代码如下:
import * as SecureStore from 'expo-secure-store'; const secureStorage = { getItem: async (key) => { return await SecureStore.getItemAsync(key); }, setItem: async (key, value) => { await SecureStore.setItemAsync(key, value); }, removeItem: async (key) => { await SecureStore.deleteItemAsync(key); }, };
- 非敏感的
app切片直接对接AsyncStorage即可,无需额外处理。
注意事项
- 不需要对expo-secure-store存储的内容做二次加密,只会增加性能开销,不会提升安全性
- 存储敏感数据的key建议增加环境前缀,比如
dev_access_token、prod_access_token,避免不同环境数据冲突 - 用户退出登录时需同时清空两个存储库的相关数据,避免敏感信息残留
内容的提问来源于stack exchange,提问作者Pluem
相关产品推荐
相关产品推荐

