目录

IFAA免密认证

场景介绍

约束与限制

业务流程

注册流程说明:

  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. 导入相关模块。

    import { ifaa } from '@kit.OnlineAuthenticationKit';
    import { userAuth } from '@kit.UserAuthenticationKit';
    import { BusinessError } from '@kit.BasicServicesKit';
  2. 开通IFAA免密认证能力。

    try {
      // 开发者根据IIFAA协议构造TLV入参,转换为Uint8Array,得到userTokenFp,再使用ifaa.getAnonymousIdSync接口。
      let getAnonIdResult: Uint8Array = ifaa.getAnonymousIdSync(userTokenFp);
      console.info('Succeeded in getting anonymous id, result:', getAnonIdResult);
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to get anonymous id. Code is ${err.code}, message is ${err.message}`);
    }
    try {
      // 开发者需使用getAnonymousIdSync从服务端获取签名后的开通数据
      // 开发者将开通数据(IIFAA协议的TLV格式)转换为Uint8Array,得到tlvRegisterFp,再使用ifaa.register接口。
      let registerPromise: Promise<Uint8Array> = ifaa.register(tlvRegisterFp);
      registerPromise.then(registerResult => {
        console.info('Succeeded in doing register, result:', registerResult);
        // 开通成功,开发者获取ifaa.register结果并处理。
        // ...
      }).catch((err: BusinessError) =>{
        console.error(`Failed to call register. Code: ${err.code}, message: ${err.message}`);
        // 开通失败,开发者获取ifaa.register错误并处理。
      });
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to register. Code is ${err.code}, message is ${err.message}`);
    }
  3. 使用IFAA免密认证能力。

    // 开发者根据IIFAA协议构造TLV入参,转换为Uint8Array,得到userTokenFp,再使用ifaa.getAnonymousIdSync接口。
    let getAnonIdResult: Uint8Array;
    try {
      getAnonIdResult = ifaa.getAnonymousIdSync(userTokenFp);
      console.info('Succeeded in getting anonymous id, result:', getAnonIdResult);
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to get anonymous id. Code is ${err.code}, message is ${err.message}`);
    }
    
    // 开发者需使用getAnonymousIdSync从服务端获取签名后的认证数据
    // 获取此次免密支付的challenge
    let ifaaChallenge: Uint8Array = new Uint8Array([0]);
    try {
      ifaaChallenge = ifaa.preAuthSync();
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to pre auth. Code is ${err.code}, message is ${err.message}`);
    }
    let authParam: userAuth.AuthParam = {
      challenge: ifaaChallenge,
      authType: [userAuth.UserAuthType.FINGERPRINT],
      authTrustLevel: userAuth.AuthTrustLevel.ATL4
    };
    
    try {
      let userAuthInstance = userAuth.getUserAuthInstance(authParam, {title: ' '});
      userAuthInstance.on('result', {
        onResult(result) {
          let authToken = result.token;
          try {
            // 生物特征认证成功后,调用IFAA认证
            console.info('IFAA auth start');
            // 开发者将认证数据(IIFAA协议的TLV格式)转换为Uint8Array,得到tlvAuthFp,再使用ifaa.authSync接口。
            // 开发者根据业务需求选择同步/异步接口
            let authResult: Uint8Array = ifaa.authSync(authToken, tlvAuthFp);
            console.info('Succeeded in auth, result:', authResult);
            // 开发者处理authResult
            // ...
          } catch (error) {
            const err: BusinessError = error as BusinessError;
            console.error(`Failed to call auth. Code is ${err.code}, message is ${err.message}`);
            // ...
          }
        }
      });
      userAuthInstance.start();
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to user auth. Code is ${err.code}, message is ${err.message}`);
    }
  4. 注销IFAA免密认证能力。

    // 开发者根据IIFAA协议构造TLV入参,转换为Uint8Array,得到userTokenFp,再使用ifaa.getAnonymousIdSync接口。
    try {
      let getAnonIdResult: Uint8Array = ifaa.getAnonymousIdSync(userTokenFp);
      console.info('Succeeded in getting anonymous id, result:', getAnonIdResult);
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to get anonymous id. Code is ${err.code}, message is ${err.message}`);
    }
    
    // 开发者需使用getAnonymousId的结果从服务端获取签名后的注销数据
    // 开发者将注销数据(IIFAA协议的TLV格式)转换为Uint8Array,得到tlvDeregisterRp,再使用ifaa.deregisterSync接口。
    try {
      ifaa.deregisterSync(tlvDeregisterRp);
      // ...
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to deregister. Code is ${err.code}, message is ${err.message}`);
      // ...
    }