ios指纹登陆流程原理
作者:Vic ,分类:ios 发布于 2019-09-12 19:38:55.0

最近在开发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给你, 你就可以为所欲为了😱😱😱😱.........

上代码 , 下方代码可用于开启指纹和验证指纹的逻辑

  • 1.引入 #import <LocalAuthentication/LocalAuthentication.h>
  • 2.验证代码
    1. // 是否支持指纹
    2. if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
    3. NSLog(@"系统版本不支持TouchID");
    4. return;
    5. }
    6. LAContext *context = [[LAContext alloc] init];
    7. // 指纹认证错误后的第二个按钮文字(不写默认为“输入密码”)
    8. context.localizedFallbackTitle = @"输入密码";
    9. NSError *error = nil;
    10. if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
    11. [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请按home键,开启指纹登录" reply:^(BOOL success, NSError * _Nullable error) {
    12. if (success) {
    13. // 此函数块是调用主函数线程下执行,验证成功的情况下可能需要更新view上的一些title,来提示用户验证成功
    14. dispatch_async(dispatch_get_main_queue(), ^{
    15. // NSLog(@"TouchID 验证成功,已开启会指纹登录");
    16. // 此处可以系统指纹识别通过--> 更新你的服务器设置
    17. });
    18. }else if(error){
    19. switch (error.code) {
    20. case LAErrorAuthenticationFailed:{
    21. NSLog(@"TouchID 验证失败");
    22. break;
    23. }
    24. case LAErrorUserCancel:{
    25. NSLog(@"TouchID 被用户手动取消");
    26. }
    27. break;
    28. case LAErrorUserFallback:{
    29. NSLog(@"用户不使用TouchID,选择手动输入密码");
    30. }
    31. break;
    32. case LAErrorSystemCancel:{
    33. NSLog(@"TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)");
    34. }
    35. break;
    36. case LAErrorPasscodeNotSet:{
    37. NSLog(@"TouchID 无法启动,因为用户没有设置密码");
    38. }
    39. break;
    40. case LAErrorBiometryNotEnrolled:{
    41. NSLog(@"TouchID 无法启动,因为用户没有设置TouchID");
    42. }
    43. break;
    44. case LAErrorBiometryNotAvailable:{
    45. NSLog(@"TouchID 无效");
    46. }
    47. break;
    48. case LAErrorBiometryLockout:{
    49. NSLog(@"TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码)");
    50. }
    51. break;
    52. case LAErrorAppCancel:{
    53. NSLog(@"当前软件被挂起并取消了授权 (如App进入了后台等)");
    54. }
    55. break;
    56. case LAErrorInvalidContext:{
    57. NSLog( @"当前软件被挂起并取消了授权 (LAContext对象无效)");
    58. }
    59. break;
    60. default:
    61. break;
    62. }
    63. }
    64. }];
    65. }else{
    66. NSLog(@"当前设备不支持TouchID,开启失败");
    67. }