想结合使用 TouchID 和电子邮件来保护我的应用程序
Want to secure my app with combination of TouchID & email
我的一个应用程序具有使用电子邮件和密码登录的功能,并且按预期工作正常。
现在,我的客户想要什么 email + TouchID
(无密码) 需要登录应用程序。
所以我的第一个问题是我可以同时使用 TouchID
和 email
登录的组合来做到这一点吗?
我已经使用 Touch id 来简单解锁我的应用程序,但从来没有使用电子邮件 touchid
知道我该怎么做吗?
我有搜索功能,很多应用程序都在做同样的事情,但是怎么做的呢?
我从一个博客中发现,在 MDM
的帮助下,我可以配置它,但我没有使用 MDM
(移动设备管理),所以对此不确定。
提前致谢。
正如我在评论中所说,我认为这不可能,因为 Touch ID 将始终 return 给你 true
或 false
。
但您可以使用 KeyChainTouchID
来存储和保护您的邮件价值。所以,你的用户必须把他的邮件,使用touch id 来验证keychain 中存储的邮件是否相同。
文档:https://developer.apple.com/library/content/samplecode/KeychainTouchID/Introduction/Intro.html
您可以在注册时使用kSecAccessControlTouchIDCurrentSet
将电子邮件存储到钥匙串中。这样,您将存储到钥匙串中的项目将是 Current TouchID + Email
.
的组合
登录时,您可以使用touchId从钥匙串中检索电子邮件,并将其与输入的电子邮件进行比较。
要将电子邮件存储到钥匙串中,请使用以下代码:(适用于 iOS 9 及更高版本--不适用于 iOS 8)
-(void)saveToKeyChain:(NSString*)email{
CFErrorRef error = NULL;
SecAccessControlRef scaObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, kSecAccessControlTouchIDCurrentSet, &error);
NSDictionary *attributes = @{
(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService :@"ToucIdWithEmailExample",
(__bridge id)kSecValueData :[email dataUsingEncoding:NSUTF8StringEncoding],
(__bridge id)kSecUseNoAuthenticationUI :@YES,
(__bridge id)kSecAttrAccessControl : (__bridge_transfer id)scaObject
};
OSStatus initialWriteStatus = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
}
kSecAccessControlTouchIDCurrentSet in above will take store Email with current authenticated touch.
要检索钥匙串数据,您可以使用以下方法:
-(void)retriveKeyChainData{
NSDictionary *queryAttributes = @{
(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService :@"ToucIdWithEmailExample",
(__bridge id)kSecReturnData : @YES,
(__bridge id)kSecUseOperationPrompt : @"Authenticate"
}.mutableCopy;
CFTypeRef dataTypeRef = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)queryAttributes, &dataTypeRef);
if(status == errSecSuccess)
{
NSData *data = (__bridge NSData*)(dataTypeRef);
}
}
此功能将检索您在注册时存储的电子邮件 ID。您可以将其与输入的电子邮件进行比较并验证。
你可以通过这个tutorial - 如果你想详细了解它。
在您的设备上,您可以存储多个指纹样本。但是,从 OS 中您没有得到哪个手指没问题的答复。只是输入的手指是否可以。
因此无法根据输入的手指识别用户(或电子邮件地址)。
TouchID 是一种访问控制机制,而不是一种识别机制。
我的一个应用程序具有使用电子邮件和密码登录的功能,并且按预期工作正常。
现在,我的客户想要什么 email + TouchID
(无密码) 需要登录应用程序。
所以我的第一个问题是我可以同时使用 TouchID
和 email
登录的组合来做到这一点吗?
我已经使用 Touch id 来简单解锁我的应用程序,但从来没有使用电子邮件 touchid
知道我该怎么做吗?
我有搜索功能,很多应用程序都在做同样的事情,但是怎么做的呢?
我从一个博客中发现,在 MDM
的帮助下,我可以配置它,但我没有使用 MDM
(移动设备管理),所以对此不确定。
提前致谢。
正如我在评论中所说,我认为这不可能,因为 Touch ID 将始终 return 给你 true
或 false
。
但您可以使用 KeyChainTouchID
来存储和保护您的邮件价值。所以,你的用户必须把他的邮件,使用touch id 来验证keychain 中存储的邮件是否相同。
文档:https://developer.apple.com/library/content/samplecode/KeychainTouchID/Introduction/Intro.html
您可以在注册时使用kSecAccessControlTouchIDCurrentSet
将电子邮件存储到钥匙串中。这样,您将存储到钥匙串中的项目将是 Current TouchID + Email
.
登录时,您可以使用touchId从钥匙串中检索电子邮件,并将其与输入的电子邮件进行比较。
要将电子邮件存储到钥匙串中,请使用以下代码:(适用于 iOS 9 及更高版本--不适用于 iOS 8)
-(void)saveToKeyChain:(NSString*)email{
CFErrorRef error = NULL;
SecAccessControlRef scaObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, kSecAccessControlTouchIDCurrentSet, &error);
NSDictionary *attributes = @{
(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService :@"ToucIdWithEmailExample",
(__bridge id)kSecValueData :[email dataUsingEncoding:NSUTF8StringEncoding],
(__bridge id)kSecUseNoAuthenticationUI :@YES,
(__bridge id)kSecAttrAccessControl : (__bridge_transfer id)scaObject
};
OSStatus initialWriteStatus = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
}
kSecAccessControlTouchIDCurrentSet in above will take store Email with current authenticated touch.
要检索钥匙串数据,您可以使用以下方法:
-(void)retriveKeyChainData{
NSDictionary *queryAttributes = @{
(__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService :@"ToucIdWithEmailExample",
(__bridge id)kSecReturnData : @YES,
(__bridge id)kSecUseOperationPrompt : @"Authenticate"
}.mutableCopy;
CFTypeRef dataTypeRef = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)queryAttributes, &dataTypeRef);
if(status == errSecSuccess)
{
NSData *data = (__bridge NSData*)(dataTypeRef);
}
}
此功能将检索您在注册时存储的电子邮件 ID。您可以将其与输入的电子邮件进行比较并验证。
你可以通过这个tutorial - 如果你想详细了解它。
在您的设备上,您可以存储多个指纹样本。但是,从 OS 中您没有得到哪个手指没问题的答复。只是输入的手指是否可以。
因此无法根据输入的手指识别用户(或电子邮件地址)。
TouchID 是一种访问控制机制,而不是一种识别机制。