第二篇:安卓指纹接入

1.IFAA安卓接入方案

       安卓SDK有两种接入方式,Etas 生物认证服务 SDK以及原生SDK。其中,Etas 生物认证服务 SDK是在原生SDK的基础上封装了一些常用的功能,使得开发更加简单。

2 Etas 生物认证服务 SDK

       如果使用Etas 生物认证服务 SDK,首先需要下载[SDK],密码 esandinfo.下载完毕后将其引入项目中。Etas 生物认证服务 SDK 不仅集成了ifaa的接口还实现了许多其他功能。

2.1 查询机器是否支持ifaa能力

       IFAA 能力虽然覆盖了众多的机型但是始终没有做到百分百的机型覆盖,因此可以通过查询接口来查询设备是否支持ifaa能力。

 com.esandinfo.etas.ETASManager 中提供了判断当前设备是否支持某种认证类型,现有的认证类型有指纹、人脸两种认证类型,详见 IFAABaseInfo.IFAAAuthTypeEnum 的枚举。下面代码是查询方法的定义:

/*** 是否支持 IFAA* @param  context 执行环境上下文类* @param  authType 认证类型,详见 IFAABaseInfo.IFAAAuthTypeEnum 的枚举* @return  是否支持 IFAA*/publicstaticbooleanisSupportIFAA(Contextcontext,IFAABaseInfo.IFAAAuthTypeEnumauthType)

使用此方法示例代码如下所示:

// 检查本机是否支持 指纹 认证类型if(!IFAAManager.isSupportIFAA(this,IFAABaseInfo.IFAAAuthTypeEnum.AUTHTYPE_FINGERPRINT)){tvShowInfos.append("此设备不支持 IFAA 指纹");}else{//do some operation    }

2.2 IFAA注册

SDK 对外提供 com.esandinfo.etas.biz.EtasRegister 类实现 IFAA 的注册流程,以下是主要的函数定义:

// 注册初始化publicEtasResultregInit()// 执行注册操作publicvoidregister(StringifaaMsg,EtasAuthenticatorCallbackifaaAuthenticatorCallback)// 完成注册操作publicEtasResultregFinish(StringifaaMsg)

上面时序图中,客户端只需要关注 客户端APP,ETAS SDK 以及 客户业务服务器。

要完成整个注册流程,首先需要调用 regInit() 方法,当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时将字符串 etasResult.getMsg()作为消息体 发送到服务端。

接着,调用register()来完成注册操作,其中参数 ifaaMsg 为 ,为服务端接收到注册初始化产生的报文后返回的响应报文。参数 ifaaAuthenticatorCallback 为注册操作的回调,其中需要实现两个方法:onStatus和 onResult。其中 onStatus 返回用户按压指纹返回的各个状态 ,onResult 返 回 EtasResult , 当 etasResult.getCode() 为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时,将etasResult.getMsg() 作为注册第二次请求需要发送到服务端的报文。

最后调用 regFinish() 方法来完成注册操作, 其中 ifaaMsg 为注册第二次请求服务端返回的报文,当执行方法返回的 EtasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时注册成功,至此,整个注册流程结束。

以下是示例代码:

finalEtasRegisteretasRegister=newEtasRegister(ifaaBaseInfo);EtasResultetasResult=etasRegister.regInit();if(etasResult.getCode()!=IfaaCommon.IFAAErrorCodeEnum.SUCCESS) {tvShowInfos.append("注册初始化失败 : "+etasResult.getMsg()+'\n');        }...//post request and return response as msgetasRegister.register(msg,newEtasAuthenticatorCallback() {@OverridepublicvoidonStatus(IfaaCommon.AuthStatusCodeauthStatusCode) {            }@OverridepublicvoidonResult(EtasResultetasResult) {if(etasResult.getCode()!=IfaaCommon.IFAAErrorCodeEnum.SUCCESS) {//do something                }            }        });...//post request and return response as msgEtasResultetasResult=etasRegister.regFinish(msg);

2.3 IFAA认证

2.3.1 IFAA认证

SDK 提供 com.esandinfo.etas.biz.EtasAuthentication 实现 IFAA 的认证操作, 以下是主要的函数定义:

// IFAA 认证初始化publicEtasResultauthInit()// 执行本地认证操作publicvoidauth(StringifaaMsg,EtasAuthenticatorCallbackifaaAuthenticatorCallback)// 完成认证操作publicEtasResultauthFinish(StringifaaMsg)

要完成整个认证流程,首先需要调用 authInit() 方法,当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时将字符串 etasResult.getMsg()作为消息体 发送到服务端。

接着,调用auth()来完成认证操作,其中参数 ifaaMsg 为 ,为服务端接收到认证初始化产生的报文后返回的响应报文。参数 ifaaAuthenticatorCallback 为认证操作的回调,其中需要实现两个方法:onStatus 和 onResult。其中 onStatus 返回用户按压指纹返回的各个状态 ,onResult 返 回 EtasResult , 当 etasResult.getCode() 为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时,将etasResult.getMsg() 作为认证第二次请求需要发送到服务端的报文。

最后调用 authFinish() 方法来完成认证操作, 其中 ifaaMsg 为认证第二次请求服务端返回的报文,当执行方法返回的 EtasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时认证成功,至此,整个认证流程结束。

以下是示例代码:

EtasAuthenticationetasAuthentication=newEtasAuthentication(ifaaBaseInfo);EtasResultetasResult=etasAuthentication.authInit();...//post request and return response as msgetasAuthentication.auth(msg,newEtasAuthenticatorCallback(){@OverridepublicvoidonStatus(IfaaCommon.AuthStatusCodeauthStatusCode){//do something    }@OverridepublicvoidonResult(EtasResultetasResult){if(etasResult.getCode()!=IfaaCommon.IFAAErrorCodeEnum.SUCCESS){//do something        }    }});...//post request and return response as msgEtasResultetasResult=etasAuthentication.authFinish(msg);

2.3.2 IFAA多指位更新

      “多指位”是为了提高安全性和用户友好程度,在注册的指纹发生变化时通知应用采取合理措施的一种机制。

        当用户使用未注册的指位进行校验时,eTAS SDK会返回对应的错误信息,客户APP应根据该信息要求用户认证用户身份,并调用eTAS SDK指位更新接口完成新指位的注册。 IFAA在Android上的指纹维护方面有两种策略:

第一种是较早的策略,只有一个手指开通指纹支付。

为了提高应用的用户友好设计,提出第二种“多指位”的策略,从2016年10月之后上市的机器,基本上都支持多指位功能。在用户使用了非IFAA注册指纹进行校验的时候,服务端会通知应用发生指位更新错误。

因此,如果要使用 IFAA 认证,首先要进行 IFAA 的注册,而 IFAA 的一次注册是绑定某一个指位的,也就是说一次注册以后只有某一个指位能使用 IFAA 认证,其他指纹虽然已经录入到手机系统中,但是因为没有进行注册,所以还不能使用。IFAA 可以通过更新指位的方式实现多个指位同时使用 IFAA 服务。SDK 提供 com.esandinfo.etas.biz.EtasTemplateUpdater 类进行 IFAA 指位更新操作,主要有如下函数:

// 指位更新初始化publicEtasResulttemplateUpdata(StringifaaMessage)//完成指位更新操作publicEtasResulttemplateUpdaFinish(StringifaaMsg)

要更新指位需要调用 templateUpdata() 方法,其中参数 ifaaMessage 是在认证流程的认证操作完成中(authFinish()方法),如果返回 etasResult.getCode() 错误码为IfaaCommon.IFAAErrorCodeEnum.WRONG_AUTHDATAINDEX 时,etasResult.getMsg() 就作为参数传入 templateUpdata() 方法中,此方法执行结束后,返回的报文 EtasResult 类型中,当 etasResult.getCode() 为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时 ,etasResult.getMsg() 为指纹更新请求需要发送到服务端的报文。

接着调用 templateUpdaFinish() 方法,其中参数 ifaaMsg 为 指纹更新请求服务端返回的报文,方法执行完毕后返回 EtasResult对象,其中当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时,更新指位成功。

注:

指位更新是一个比较敏感的操作,建议(不是必须)先进行密码或者支付码等操作后再进行指位更新操作。

指位更新和指纹认证是一个连续的流程,必须在指纹认证失败,并且返回状态码为 IFAA_WRONG_AUTHDATAINDEX 的时候执行。

以下是示例代码:

finalEtasTemplateUpdateretasTemplateUpdater=newEtasTemplateUpdater(ifaaBaseInfo);// 认证初始化,参数 ifaaMessage 是在认证流程的认证操作完成后传入finalEtasResultetasResult=etasTemplateUpdater.templateUpdaInit(ifaaMessage);...//post request and return response as messageEtasResultetasResult=etasTemplateUpdater.templateUpdaFinish(message);if(etasResult.getCode()==IfaaCommon.IFAAErrorCodeEnum.SUCCESS) {//do something}

2.4 IFAA注销

SDK 提供 com.esandinfo.etas.biz.EtasRegister 类进行 IFAA 注销操作,主要有如下函数:

// 注销初始化publicEtasResultderegInit()// 执行终端注销操作publicvoiddereg(StringifaaMsg,EtasAuthenticatorCallbackifaaAuthenticatorCallback)

要完成整个认证流程,首先需要调用 deregInit() 方法,当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时将字符串 etasResult.getMsg()作为消息体 发送到服务端。

接着,调用dereg()来完成认证操作,其中参数 ifaaMsg 为 ,为服务端接收到注销初始化产生的报文后返回的响应报文。参数 ifaaAuthenticatorCallback 为注销操作的回调,其中需要实现两个方法:onStatus 和 onResult。其中 onStatus 在此场景下无用 ,onResult 返 回 EtasResult , 当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时,完成注销。

以下是示例代码:

finalEtasDeregisterifaaDeregister=newEtasDeregister(ifaaBaseInfo);EtasResultetasResult=ifaaDeregister.deregInit();if(etasResult.getCode()!=IfaaCommon.IFAAErrorCodeEnum.SUCCESS) {tvShowInfos.append("注销初始化失败 : "+etasResult.getMsg()+'\n');}...//post request and return response as msgifaaDeregister.dereg(msg,newEtasAuthenticatorCallback() {@OverridepublicvoidonStatus(IfaaCommon.AuthStatusCodeauthStatusCode) {// 此处回调函数没用    }@OverridepublicvoidonResult(EtasResultetasResult) {if(etasResult.getCode()!=IfaaCommon.IFAAErrorCodeEnum.SUCCESS) {// 此处不是运行在 UI 进程, 不能直接更新 UI// do something        }    }});

2.5 IFAA状态查询

状态查询主要用于客户APP在需要确定用户是否已经在该终端注册过指纹的场景,如用户启动新安装的客户APP时,需要检查该用户是否已在该设备上注册过指纹,以避免用户重复注册。SDK 提供 com.esandinfo.etas.biz.EtasStatus 类进行 IFAA状态查询,主要有如下函数:

// 查询 ifaa 注册状态初始化publicEtasResultcheckStatusInit()// 解析查询结果publicEtasResultparseResult(Stringmsg)// 查询手机终端是否已经注册publicEtasResultcheckLocalStatus(Stringtoken)

要完成整个认证流程,首先需要调用 checkStatusInit() 方法,当返回码不同时有不同的处理:

当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.STATUS_REGISTERED 时,表示本地取到了 token,已经是注册状态,就不发请求到服务端

当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时将字符串 etasResult.getMsg()作为消息体 发送到服务端。

接着,调用parseResult()来解析查询结果,其中参数 ifaaMsg 为 ,为服务端接收到认证初始化产生的报文后返回的响应报文。当etasResult.getCode() 为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时 ,etasResult.getMsg() 为 token,在查询手机终端是否已经注册中要使用。

最后调用 checkLocalStatus() 方法来 查询手机终端是否已经注册, 其中 token 为在解析查询结果中在成功码情况下的etasResult.getMsg() 中字符。因为注册数据放在 TEE 里面,和 apk 无关,所以需要这一步,返回结果中当 etasResult.getCode()为 IfaaCommon.IFAAErrorCodeEnum.SUCCESS 时,已经注册。

以下是示例代码:

finalEtasStatusetasStatus=newEtasStatus(ifaaBaseInfo);EtasResultetasResult=etasStatus.checkStatusInit();if(etasResult.getCode()==IfaaCommon.IFAAErrorCodeEnum.STATUS_REGISTERED) {tvShowInfos.append("IFAA已经注册了\n");return;}...//post request and return response as msgEtasResultetasResult=etasStatus.parseResult(msg);etasResult=etasStatus.checkLocalStatus(etasResult.getMsg());...//do something

你可能感兴趣的:(第二篇:安卓指纹接入)