首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LAContext和touchIDAuthenticationAllowableReuseDuration获取密钥链项

使用LAContext和touchIDAuthenticationAllowableReuseDuration获取密钥链项
EN

Stack Overflow用户
提问于 2016-06-22 00:11:54
回答 1查看 1.7K关注 0票数 5

我正在尝试将touchIDAuthenticationAllowableReuseDuration的功能添加到我的应用程序中。我使用Touch ID来验证用户进入应用程序,同时从密钥链中恢复一个项目。在我尝试添加之前没有问题,它总是要求提供Touch ID,或者如果设备密码不可用。到目前为止,我已经设法让它做了同样的事情,当我在指定的超时时间内打开应用程序时,它不会像它应该的那样显示Touch ID提示,如果我所做的只是验证用户的身份,那么我就完成了,但我遇到的问题是,我还想从密钥链中恢复一个项目,当成功绕过提示时,但是一旦我调用SecItemCopyMatching(…),我就没有拿回项目,相反,我一直得到errSecAuthFailed

我在网上到处寻找,我找到的最好的东西是苹果的示例代码KeychainTouchID,但同样,它不能同时进行身份验证和从钥匙链中获取项,我试图将其添加到他们的代码中,但我仍然收到相同的错误。

以前有没有人尝试过这样的东西?你是怎么让它工作的?这是我现在拥有的代码:

代码语言:javascript
复制
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);
    }
}];
EN

回答 1

Stack Overflow用户

发布于 2019-05-23 04:25:53

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37949518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档