最近在开发ios的指纹登陆模块,我这里就画个图记录一下基本的原理,很简单,虽说指纹登陆已经out了,人家都用faceId登陆,没办法, 我这动力不足,起步慢啊😪😪😪😪.
设备指纹代替账号登陆的开启,一是建立在设备支持的状态下,二是建立在app用户必须是已经登陆的状态,服务端还需要建立存储设备信息的区域. 为了安全起见,必须使用https的协议,建议app端和服务端交互使用公私钥加解密的方式保护数据, <span style='color:red;'>正题</span>: 图中用户Jack登陆成功后,设备不再是匿名的,用户和设备就建立了一种依赖关系,须给设备分配一个唯一编码和用户做对应关系,什么这个XXID,那个XXID随便用, 这样就有了开启指纹登陆的必要参数了了😉😉😉😉...
首先先好歹判断下我们的设备是否支持指纹吧😅😅,然后把设备的唯一码给服务端,服务端根据请求区分出用户是Jack,把设备唯一码和Jack做出关联关系,生成出指纹登陆专用的设备账号和设备密码入库,在把设备账号和设备密码分别加密返回给app端,app端得到了设备登陆账号和密码,保存到我们大ios的安全圣地KeyChain的私有区域,到这一步也就意味着开启了设备指纹登录😯....
到了验证指纹登陆的这步了,首先先好歹判断下设备是否噻😇😇..然后在去我们大ios的安全圣地KeyChain的私有区域取出我的设备登陆专用账号和密码,以登陆类型为:设备指纹登陆的方式请求 Login接口, 服务端根据你的设备账号去查询你在第二步中的保存的关联关系,就可以区分出你是Jack的账号了,再把全局的请求参数Token给你, 你就可以为所欲为了😱😱😱😱.........
// 是否支持指纹
if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
NSLog(@"系统版本不支持TouchID");
return;
}
LAContext *context = [[LAContext alloc] init];
// 指纹认证错误后的第二个按钮文字(不写默认为“输入密码”)
context.localizedFallbackTitle = @"输入密码";
NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请按home键,开启指纹登录" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
// 此函数块是调用主函数线程下执行,验证成功的情况下可能需要更新view上的一些title,来提示用户验证成功
dispatch_async(dispatch_get_main_queue(), ^{
// NSLog(@"TouchID 验证成功,已开启会指纹登录");
// 此处可以系统指纹识别通过--> 更新你的服务器设置
});
}else if(error){
switch (error.code) {
case LAErrorAuthenticationFailed:{
NSLog(@"TouchID 验证失败");
break;
}
case LAErrorUserCancel:{
NSLog(@"TouchID 被用户手动取消");
}
break;
case LAErrorUserFallback:{
NSLog(@"用户不使用TouchID,选择手动输入密码");
}
break;
case LAErrorSystemCancel:{
NSLog(@"TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)");
}
break;
case LAErrorPasscodeNotSet:{
NSLog(@"TouchID 无法启动,因为用户没有设置密码");
}
break;
case LAErrorBiometryNotEnrolled:{
NSLog(@"TouchID 无法启动,因为用户没有设置TouchID");
}
break;
case LAErrorBiometryNotAvailable:{
NSLog(@"TouchID 无效");
}
break;
case LAErrorBiometryLockout:{
NSLog(@"TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码)");
}
break;
case LAErrorAppCancel:{
NSLog(@"当前软件被挂起并取消了授权 (如App进入了后台等)");
}
break;
case LAErrorInvalidContext:{
NSLog( @"当前软件被挂起并取消了授权 (LAContext对象无效)");
}
break;
default:
break;
}
}
}];
}else{
NSLog(@"当前设备不支持TouchID,开启失败");
}