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

如何在两个Flutter应用间安全共享凭证(实现跨应用账号同步)

跨Flutter应用安全共享登录凭证方案

针对你的需求,需要分Android和iOS平台分别实现,核心是利用各自系统的跨应用权限控制机制+安全存储方案,确保仅你的两个应用能访问共享凭证:

Android 实现方案

核心依赖:Content Provider + Android Keystore

Android中只有同签名的应用才能安全共享自定义Content Provider的数据,结合Keystore加密敏感信息,避免明文泄露。

  1. 统一应用签名
    两个Flutter应用必须使用相同的签名文件打包,确保系统识别为同一开发者的应用,这是跨应用访问Content Provider的前提。

  2. 在应用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"/>
      
  3. 应用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支持设置访问组,仅限同组应用访问敏感数据。

  1. 配置App Group

    • 在Apple开发者后台,给两个应用的App ID添加相同的App Group(比如group.com.yourdomain.sharedcred)。
    • 在Xcode中,分别为两个Flutter项目开启App Groups,并勾选刚才创建的组。
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:15:39