如何在两个Flutter应用间安全共享凭证(实现跨应用账号同步)
跨Flutter应用安全共享登录凭证方案
针对你的需求,需要分Android和iOS平台分别实现,核心是利用各自系统的跨应用权限控制机制+安全存储方案,确保仅你的两个应用能访问共享凭证:
Android 实现方案
核心依赖:Content Provider + Android Keystore
Android中只有同签名的应用才能安全共享自定义Content Provider的数据,结合Keystore加密敏感信息,避免明文泄露。
统一应用签名
两个Flutter应用必须使用相同的签名文件打包,确保系统识别为同一开发者的应用,这是跨应用访问Content Provider的前提。在应用A中实现加密的Content Provider
- 创建自定义Content Provider,内部使用AndroidKeystore加密存储账号标识、token(不建议存储明文密码,优先用登录返回的token)。
- 配置Provider的权限,仅限同签名应用访问:
在AndroidManifest.xml中添加Provider声明:<provider android:name=".SharedCredentialProvider" android:authorities="com.yourdomain.sharedcredential" android:exported="true" android:grantUriPermissions="true" android:permission="com.yourdomain.PERMISSION_ACCESS_SHARED_CREDENTIAL"/> - 定义权限,限制仅同签名应用申请:
<permission android:name="com.yourdomain.PERMISSION_ACCESS_SHARED_CREDENTIAL" android:protectionLevel="signature"/>
应用B中访问共享数据
在应用B的AndroidManifest.xml中声明权限:<uses-permission android:name="com.yourdomain.PERMISSION_ACCESS_SHARED_CREDENTIAL"/>通过ContentResolver查询Provider获取加密数据,再用Keystore解密:
// Flutter中通过platform channel调用原生代码实现查询 final credential = await MethodChannel('com.yourdomain/credential').invokeMethod('getSharedCredential');
iOS 实现方案
核心依赖:App Groups + Keychain Services
iOS的App Groups允许同组应用共享容器,Keychain支持设置访问组,仅限同组应用访问敏感数据。
配置App Group
- 在Apple开发者后台,给两个应用的App ID添加相同的App Group(比如
group.com.yourdomain.sharedcred)。 - 在Xcode中,分别为两个Flutter项目开启App Groups,并勾选刚才创建的组。
- 在Apple开发者后台,给两个应用的App ID添加相同的App Group(比如
使用flutter_secure_storage实现跨应用存储
该插件支持指定Keychain访问组,配置如下:final storage = FlutterSecureStorage( iOptions: IOSOptions( accessGroup: 'group.com.yourdomain.sharedcred', // 对应创建的App Group ID ), ); // 应用A存储凭证 await storage.write(key: 'user_id', value: '123'); await storage.write(key: 'auth_token', value: 'encrypted_token'); // 应用B读取凭证 final userId = await storage.read(key: 'user_id'); final authToken = await storage.read(key: 'auth_token');
通用安全建议
- 避免存储明文密码:登录后优先使用服务端返回的token,密码仅在登录流程中使用,不持久化存储。
- 加密敏感数据:即便是共享存储,所有敏感信息都要加密后再存储,Android用Keystore,iOS用Keychain自带的加密。
- 严格权限控制:Android确保仅同签名应用能访问Provider,iOS仅允许指定App Group内的应用访问Keychain数据。
内容的提问来源于stack exchange,提问作者Jeremy HOFFMANN
相关产品推荐
相关产品推荐

