Flutter登录模块存储token的最优方案是什么?
Flutter 登录Token存储最佳实践
Flutter没有浏览器端LocalStorage的原生等价实现,Token属于用户敏感凭证,不同场景下的最优实现方案如下:
常用存储方案对比
- shared_preferences 键值存储
本质是调用平台原生的基础键值存储能力(安卓端为SharedPreferences,iOS端为NSUserDefaults),默认明文存储,读写操作为异步,适合存储非敏感的轻量数据。
注意:如果选择该方案存储登录Token,必须先对Token做对称加密后再写入,禁止直接存明文,避免设备越狱/root后、或者应用开启备份后凭证被窃取。
简单使用示例:import 'package:shared_preferences/shared_preferences.dart'; // 存储加密后的Token final prefs = await SharedPreferences.getInstance(); await prefs.setString('user_token', encryptedToken); // 读取Token String? token = prefs.getString('user_token'); // 退出登录删除Token await prefs.remove('user_token'); - flutter_secure_storage 安全存储
官方推荐的敏感数据存储方案,底层依托平台原生的安全存储区域(安卓端为KeyStore,iOS端为Keychain),自带加密能力,无需自行实现加密逻辑,安全性最高,是存储登录凭证的首选方案。
简单使用示例:import 'package:flutter_secure_storage/flutter_secure_storage.dart'; // 初始化,安卓可额外配置是否支持备份等参数 const storage = FlutterSecureStorage(); // 存储后端返回的原始Token await storage.write(key: 'user_token', value: tokenFromBackend); // 读取Token,后续请求时放到请求头Authorization字段即可 String? token = await storage.read(key: 'user_token'); // 退出登录删除Token await storage.delete(key: 'user_token'); - sqflite 本地数据库存储
适合项目本身就需要用本地数据库存储大量业务数据的场景,可将Token存在数据库对应表中,注意要对Token字段做加密处理。
最佳实践建议
- 普通业务优先选择
flutter_secure_storage存储访问Token和刷新Token,安全性和开发成本最优 - 不要将Token仅存在内存中,应用进程被系统回收后Token会丢失,会导致用户每次重启应用都需要重新登录
- Token过期后优先用刷新Token请求后端换取新的访问Token,避免频繁让用户重新输入账号密码登录
- 退出登录时必须主动清除存储的所有凭证,避免残留泄露
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

