gpt4 book ai didi

ios - 使用 LAContext 和 touchIDAuthenticationAllowableReuseDuration 获取钥匙串(keychain)项目

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:09 26 4
gpt4 key购买 nike

我正在尝试将 touchIDAuthenticationAllowableReuseDuration 的功能添加到我的应用程序中。我使用 Touch ID 对应用程序中的用户进行身份验证,同时从钥匙串(keychain)中恢复一个项目。在我尝试添加它之前没有问题,它总是要求提供 Touch ID 或者如果设备密码不可用。到目前为止,我已经设法让它做同样的事情,并且在指定的超时内打开应用程序时,它不会显示 Touch ID 提示,如果我所做的只是对用户进行身份验证的话已经完成了,但我遇到的问题是我还想从钥匙串(keychain)中恢复一个项目,当成功绕过提示时,但是一旦我调用 SecItemCopyMatching(…)我没有取回元素,而是不断收到 errSecAuthFailed

我在网上到处查看,我发现的最好的东西是 Apple 的示例代码 KeychainTouchID,但同样,它不会同时进行身份验证和从钥匙串(keychain)中获取项目同时,我尝试将其添加到他们的代码中,但我也一直遇到同样的错误。

有没有人试过这样的事情?你是怎么做到的?这是我现在的代码:

SecAccessControlRef sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, kSecAccessControlTouchIDAny, nil);

NSString *localizedReason = NSLocalizedString(@"Authenticate to access app", nil);

LAContext *context = [[LAContext alloc] init];
context.touchIDAuthenticationAllowableReuseDuration = 5;

[context evaluateAccessControl:sacObject operation:LAAccessControlOperationUseItem localizedReason:localizedReason reply:^(BOOL success, NSError *error) {
if (success) {
NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: PASSCODE_KEY,
(__bridge id)kSecReturnData: @YES,
(__bridge id)kSecUseOperationPrompt: localizedReason,
(__bridge id)kSecUseAuthenticationUI: (__bridge id)kSecUseAuthenticationUIAllow,
(__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject,
(__bridge id)kSecUseAuthenticationContext: context
};

CFTypeRef dataTypeRef = NULL;

OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef);
// This works when using Touch ID / passcode, but I get errSecAuthFailed when the prompt isn't shown because of the reuse duration.
if (status == errSecSuccess) {
NSData *resultData = (__bridge_transfer NSData *)dataTypeRef;
NSString *result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
self.recoveredString = result;

} else {
self.recoveredString = @"";
}
} else {
self.recoveredString = @"";
CFRelease(sacObject);
}
}];

最佳答案

不要每次都创建 LAContext 对象。只需捕获 evaluateAccessControl 成功的 LAContext 对象。这样您就不需要设置 touchIDAuthenticationAllowableReuseDuration。如果您在 evaluateAccessControl 已经成功的 LAContext 对象上调用 evaluateAccessControl,则将立即成功调用回复回调,而不会要求用户再次进行身份验证

当您希望用户再次进行身份验证时,只需使 LAContext 对象无效即可。

关于ios - 使用 LAContext 和 touchIDAuthenticationAllowableReuseDuration 获取钥匙串(keychain)项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com