You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多React Native应用间共享登录Token及Keychain共享方案咨询

多React Native应用共享登录Token方案

当然可以实现多React Native应用共享登录Token!不过得针对iOS和Android分别处理,因为它们的安全存储机制差异很大,下面给你详细拆解:

iOS平台:利用App Groups共享Keychain

iOS的Keychain本身支持跨应用共享,但需要依赖苹果的App Groups机制,前提是所有应用都属于同一个开发者账号。

  • 步骤1:创建并配置App Group
    登录Apple开发者后台,在「Identifiers」里创建一个App Group(比如group.com.yourcompany.sharedkeychain),然后把所有需要共享Token的应用都关联到这个App Group上。

  • 步骤2:Xcode中开启App Groups权限
    打开每个RN应用的Xcode项目,进入「Signing & Capabilities」,点击「+ Capability」添加「App Groups」,然后勾选你刚才创建的那个App Group。

  • 步骤3:react-native-keychain指定accessGroup
    存储和获取Token时,只要加上accessGroup参数,就能访问共享的Keychain区域:

    import * as Keychain from 'react-native-keychain';
    
    // 存储共享Token
    await Keychain.setGenericPassword(
      'authTokenKey',
      'your-actual-auth-token',
      {
        accessGroup: 'group.com.yourcompany.sharedkeychain' // 和你创建的App Group一致
      }
    );
    
    // 获取共享Token
    const { password: token } = await Keychain.getGenericPassword({
      accessGroup: 'group.com.yourcompany.sharedkeychain'
    });
    

Android平台:同签名+共享存储实现

Android的安全存储默认是应用私有,要跨应用共享需要满足两个核心条件:所有应用使用相同的签名,并且配置共享存储区域。

方案1:基于SharedPreferences的共享(简单易实现)

可以使用react-native-shared-preferences库,配合Android的sharedUserId或者共享Preferences配置:

  • 步骤1:所有应用设置相同的sharedUserId
    在每个应用的android/app/src/main/AndroidManifest.xml里添加:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.yourapp1"
      android:sharedUserId="com.yourcompany.shared"> <!-- 所有应用用同一个值 -->
    
  • 步骤2:初始化共享Preferences
    在RN代码里指定共享的Preferences名称:

    import SharedPreferences from 'react-native-shared-preferences';
    
    // 初始化共享的Preferences
    SharedPreferences.setName('com.yourcompany.shared_auth');
    
    // 存储Token
    await SharedPreferences.setItem('authToken', 'your-actual-token');
    
    // 获取Token
    const token = await SharedPreferences.getItem('authToken');
    

方案2:基于KeyStore+Content Provider(更安全)

如果需要更高的安全性(比如Token加密存储),可以封装一个原生Content Provider来处理KeyStore的读写,然后让同签名的应用访问这个Provider。这种方式需要写少量原生代码,但安全性更接近Keychain的级别。

  • 核心思路:
    1. 在其中一个应用里创建Content Provider,负责加密存储和读取Token(用Android KeyStore)。
    2. 在Provider的配置里设置android:permission,允许同签名的应用访问。
    3. 在其他应用里通过RN原生模块调用这个Provider的方法来获取Token。

关键注意事项

  • iOS:必须是同一开发者账号下的应用,App Group配置必须完全一致。
  • Android:所有应用必须使用相同的签名文件打包,否则无法访问共享存储。
  • react-native-keychain在Android上默认不支持跨应用共享,所以需要换用上述方案,或者修改其原生代码适配共享存储。

内容的提问来源于stack exchange,提问作者 alb445

火山引擎 最新活动