You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:45:03