文档管理中心

IFAA免密认证

场景介绍

  • 开通:提供移动端开通生物特征(指纹/3D人脸)IFAA免密认证的能力。使用用户已有的生物特征类型进行开通,会开通移动端对应生物特征类型的IFAA免密认证能力。

  • 认证:提供移动端认证生物特征(指纹/3D人脸)IFAA免密认证的能力。使用用户已开通的生物特征进行认证,认证成功;使用未开通的生物特征进行认证,认证失败。

  • 注销:提供移动端注销生物特征(指纹/3D人脸)IFAA免密认证的能力。使用用户已开通的生物特征类型进行注销,会注销移动端对应生物特征类型的IFAA免密认证能力。

约束与限制

  • 应用已接入IIFAA联盟,可以从IIFAA中心服务器获取签名数据。

  • 移动端设备需要支持生物特征(指纹/3D人脸),查询当前移动端设备是否支持ATL4级别的认证可信等级。

    收起
    自动换行
    深色代码主题
    复制
    1. import { userAuth } from '@kit.UserAuthenticationKit';
    2. import { BusinessError } from '@kit.BasicServicesKit';
    3. // ...
    4. function getAvailableStatus() {
    5. try {
    6. // 示例,查询设备人脸识别是否支持ATL4级别的认证可信等级
    7. userAuth.getAvailableStatus(userAuth.UserAuthType.FACE, userAuth.AuthTrustLevel.ATL4);
    8. console.info('current auth trust level is supported');
    9. } catch (error) {
    10. const err: BusinessError = error as BusinessError;
    11. console.error(`current auth trust level is not supported. Code is ${err?.code}, message is ${err?.message}`);
    12. }
    13. }
  • 移动端设备使用此服务时需要处于联网状态。

  • IFAA服务会将匿名化的指纹ID和面容ID等个人信息返回至应用,以提供绑定具体生物特征的免密认证能力。应用将个人信息上云前,需要向用户明示并且取得同意,详细请参考个人数据处理说明

业务流程

注册流程说明:

  1. 应用客户端调用getAnonymousIdSync接口通过用户标识获取设备标识ID。
  2. 应用客户端向应用服务端获取开通数据。
  3. 应用客户端调用register接口注册,获取注册报文。
  4. 应用客户端将注册报文上报至应用服务端,应用服务端验证后返回结果。

认证流程说明:

  1. 应用客户端调用getAnonymousIdSync接口通过用户标识获取设备标识ID。
  2. 应用客户端向应用服务端获取认证数据。
  3. 应用客户端调用preAuthSync接口获取免密支付challenge。
  4. 应用客户端请求身份认证,完成生物特征认证。
  5. 应用客户端调用auth接口进行IFAA认证,获取认证报文。
  6. 应用客户端将认证报文上报至应用服务端,应用服务端验证后返回结果。

关闭流程说明:

  1. 应用客户端调用getAnonymousIdSync接口通过用户标识获取设备标识ID。
  2. 应用客户端向应用服务端获取注销数据。
  3. 应用客户端调用deregisterSync接口注销IFAA。

接口说明

以下是开通、认证、注销的所需要的接口,具体API说明详见接口文档

展开
接口名 描述
register(registerData: Uint8Array): Promise<Uint8Array> 开通IFAA免密认证,使用Promise异步回调。
auth(authToken: Uint8Array, authData: Uint8Array): Promise<Uint8Array> IFAA免密认证,使用Promise异步回调。
deregisterSync(deregisterData: Uint8Array): void 注销IFAA免密认证,同步返回结果。
getAnonymousIdSync(userToken: Uint8Array): Uint8Array 获取IFAA免密认证的匿名化ID,同步返回结果。

开发步骤

  1. 导入相关模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { ifaa } from '@kit.OnlineAuthenticationKit';
    2. import { userAuth } from '@kit.UserAuthenticationKit';
    3. import { BusinessError } from '@kit.BasicServicesKit';
  2. 开通IFAA免密认证能力。

    收起
    自动换行
    深色代码主题
    复制
    1. try {
    2. // 开发者根据IIFAA协议构造TLV入参,转换为Uint8Array,得到userTokenFp,再使用ifaa.getAnonymousIdSync接口。
    3. let getAnonIdResult: Uint8Array = ifaa.getAnonymousIdSync(userTokenFp);
    4. console.info('Succeeded in getting anonymous id, result:', getAnonIdResult);
    5. } catch (error) {
    6. const err = error as BusinessError;
    7. console.error(`Failed to get anonymous id. Code is ${err.code}, message is ${err.message}`);
    8. }
    9. try {
    10. // 开发者需使用getAnonymousIdSync从服务端获取签名后的开通数据
    11. // 开发者将开通数据(IIFAA协议的TLV格式)转换为Uint8Array,得到tlvRegisterFp,再使用ifaa.register接口。
    12. let registerPromise: Promise<Uint8Array> = ifaa.register(tlvRegisterFp);
    13. registerPromise.then(registerResult => {
    14. console.info('Succeeded in doing register, result:', registerResult);
    15. // 开通成功,开发者获取ifaa.register结果并处理。
    16. // ...
    17. }).catch((err: BusinessError) =>{
    18. console.error(`Failed to call register. Code: ${err.code}, message: ${err.message}`);
    19. // 开通失败,开发者获取ifaa.register错误并处理。
    20. });
    21. } catch (error) {
    22. const err = error as BusinessError;
    23. console.error(`Failed to register. Code is ${err.code}, message is ${err.message}`);
    24. }
  3. 使用IFAA免密认证能力。

    收起
    自动换行
    深色代码主题
    复制
    1. // 开发者根据IIFAA协议构造TLV入参,转换为Uint8Array,得到userTokenFp,再使用ifaa.getAnonymousIdSync接口。
    2. let getAnonIdResult: Uint8Array;
    3. try {
    4. getAnonIdResult = ifaa.getAnonymousIdSync(userTokenFp);
    5. console.info('Succeeded in getting anonymous id, result:', getAnonIdResult);
    6. } catch (error) {
    7. const err = error as BusinessError;
    8. console.error(`Failed to get anonymous id. Code is ${err.code}, message is ${err.message}`);
    9. }
    10. // 开发者需使用getAnonymousIdSync从服务端获取签名后的认证数据
    11. // 获取此次免密支付的challenge
    12. let ifaaChallenge: Uint8Array = new Uint8Array([0]);
    13. try {
    14. ifaaChallenge = ifaa.preAuthSync();
    15. } catch (error) {
    16. const err = error as BusinessError;
    17. console.error(`Failed to pre auth. Code is ${err.code}, message is ${err.message}`);
    18. }
    19. let authParam: userAuth.AuthParam = {
    20. challenge: ifaaChallenge,
    21. authType: [userAuth.UserAuthType.FINGERPRINT],
    22. authTrustLevel: userAuth.AuthTrustLevel.ATL4
    23. };
    24. try {
    25. let userAuthInstance = userAuth.getUserAuthInstance(authParam, {title: ' '});
    26. userAuthInstance.on('result', {
    27. onResult(result) {
    28. let authToken = result.token;
    29. try {
    30. // 生物特征认证成功后,调用IFAA认证
    31. console.info('IFAA auth start');
    32. // 开发者将认证数据(IIFAA协议的TLV格式)转换为Uint8Array,得到tlvAuthFp,再使用ifaa.authSync接口。
    33. // 开发者根据业务需求选择同步/异步接口
    34. let authResult: Uint8Array = ifaa.authSync(authToken, tlvAuthFp);
    35. console.info('Succeeded in auth, result:', authResult);
    36. // 开发者处理authResult
    37. // ...
    38. } catch (error) {
    39. const err: BusinessError = error as BusinessError;
    40. console.error(`Failed to call auth. Code is ${err.code}, message is ${err.message}`);
    41. // ...
    42. }
    43. }
    44. });
    45. userAuthInstance.start();
    46. } catch (error) {
    47. const err = error as BusinessError;
    48. console.error(`Failed to user auth. Code is ${err.code}, message is ${err.message}`);
    49. }
  4. 注销IFAA免密认证能力。

    收起
    自动换行
    深色代码主题
    复制
    1. // 开发者根据IIFAA协议构造TLV入参,转换为Uint8Array,得到userTokenFp,再使用ifaa.getAnonymousIdSync接口。
    2. try {
    3. let getAnonIdResult: Uint8Array = ifaa.getAnonymousIdSync(userTokenFp);
    4. console.info('Succeeded in getting anonymous id, result:', getAnonIdResult);
    5. } catch (error) {
    6. const err = error as BusinessError;
    7. console.error(`Failed to get anonymous id. Code is ${err.code}, message is ${err.message}`);
    8. }
    9. // 开发者需使用getAnonymousId的结果从服务端获取签名后的注销数据
    10. // 开发者将注销数据(IIFAA协议的TLV格式)转换为Uint8Array,得到tlvDeregisterRp,再使用ifaa.deregisterSync接口。
    11. try {
    12. ifaa.deregisterSync(tlvDeregisterRp);
    13. // ...
    14. } catch (error) {
    15. const err = error as BusinessError;
    16. console.error(`Failed to deregister. Code is ${err.code}, message is ${err.message}`);
    17. // ...
    18. }
在 指南 中进行搜索
请输入您想要搜索的关键词