访问共享钥匙串时,错误代码-25308(errSecInteractionNotAllowed)

时间:2019-03-11 16:20:36

标签: ios xcode react-native keychain

我正在使用https://github.com/oblador/react-native-keychain开发一个本机应用程序,以从钥匙串中保存和获取东西。

存储在钥匙串中的东西(以及其他一些东西)应该可以从我们所有的应用程序中访问。因此,在功能下的xcode中,我已激活了一个应用程序组“ group.something.test”。

我正在使用react-native-keychain的setGenericPassword函数,如下所示:

await Keychain.setGenericPassword(
  'a username',
  'a password', 
  { 
    service: 'a userId', 
    accessible: Keychain.ACCESSIBLE.ALWAYS, 
    accessGroup: 'group.something.test', 
    accessControl: Keychain.ACCESS_CONTROL.DEVICE_PASSCODE
  }
);

在本机模块中,它将把它存储到钥匙串中,如下所示:

SecAccessControlRef sacRef = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
                                                                 kSecAttrAccessibleAlways,
                                                                 kSecAccessControlDevicePasscode,
                                                                 &error);
NSDictionary *attributes = attributes = @{
    (__bridge NSString *)kSecClass: (__bridge id)(kSecClassGenericPassword),
    (__bridge NSString *)kSecAttrService: service,
    (__bridge NSString *)kSecAttrAccount: username,
    (__bridge NSString *)kSecValueData: [password dataUsingEncoding:NSUTF8StringEncoding],
    (__bridge NSString *)kSecAttrAccessControl] = (__bridge id)sacRef,
    (__bridge NSString *)kSecAttrAccessGroup] = accessGroup;
  };

...
    OSStatus osStatus = SecItemAdd((__bridge CFDictionaryRef) attributes, NULL);
...

通过以下方式检索钥匙串项目:

await Keychain.getGenericPassword({ service: 'a userId' });

这将运行以下本机代码:

NSDictionary *query = @{
    (__bridge NSString *)kSecClass: (__bridge id)(kSecClassGenericPassword),
    (__bridge NSString *)kSecAttrService: service,
    (__bridge NSString *)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,
    (__bridge NSString *)kSecReturnData: (__bridge id)kCFBooleanTrue,
    (__bridge NSString *)kSecMatchLimit: (__bridge NSString *)kSecMatchLimitOne,
    (__bridge NSString *)kSecUseOperationPrompt:@"Authenticate to retrieve secret"
  };

CFTypeRef foundTypeRef = NULL;
  OSStatus osStatus = SecItemCopyMatching((__bridge CFDictionaryRef) query, (CFTypeRef*)&foundTypeRef);

这在第一个应用程序中很好用,我可以从钥匙串中存储和检索项目。 当我通过仅将显示名称和捆绑标识符更改为其他名称通过xcode部署第二个应用程序时,它也可以工作。我可以检索第一个应用程序保存的密钥。 但是,如果现在返回第一个应用程序并尝试检索钥匙串项,则osStatus为-25308(errSecInteractionNotAllowed)。 如果我卸载第二个应用程序,它将再次在第一个应用程序中开始工作。

我在做什么错?在项目设置中我还需要做些其他事情吗? 我也尝试过使用钥匙串组功能,将钥匙串组与钥匙串组数组中的第一个索引相同,并将该ID用作kSecAttrAccessGroup。

0 个答案:

没有答案