一、开发者准备

应用在开发用户身份认证功能时,需要先了解以下流程,并根据实际需求参考对应指导开发。

  • 查询设备支持的用户身份认证能力。
  • 发起身份认证请求,获取身份认证结果。
  • 校验和使用认证结果:请参考通用密钥库二次认证密钥访问控制。
  • (可选)认证过程中取消认证。
  • (可选)切换自定义认证。
1.1 申请权限

在开发具备用户身份认证的应用前,需要先申请权限ohos.permission.ACCESS_BIOMETRIC,应用才能使用生物特征识别能力(如人脸、指纹)进行身份认证。


该权限授权方式为system_grant(系统授权),开发者只需要在module.json5配置文件的requestPermissions标签中声明权限,即可获取系统授权。

二、查询支持的认证能力

不同的设备对于认证能力(人脸、指纹、口令)的支持性各有差异,开发者在发起认证前应当先查询当前设备支持的用户认证能力。

2.1 接口说明

具体参数、返回值、错误码等描述,请参考对应的userAuth.getAvailableStatus。

接口名称功能描述
getAvailableStatus(authType : UserAuthType, authTrustLevel : AuthTrustLevel): void根据指定的认证类型、认证等级,检测当前设备是否支持相应的认证能力。
2.2 开发步骤
  1. 申请权限:ohos.permission.ACCESS_BIOMETRIC。
  2. 指定认证类型(UserAuthType)和认证等级(AuthTrustLevel),调用getAvailableStatus接口查询当前的设备是否支持相应的认证能力。
    认证可信等级的详细介绍请参见认证可信等级划分原则。

以查询设备是否支持认证可信等级≥ATL3的人脸认证功能为例:

obtainingSupported() {
  try {
    // 查询认证能力是否支持
    userAuth.getAvailableStatus(userAuth.UserAuthType.FACE, userAuth.AuthTrustLevel.ATL3);
    Logger.info('current auth trust level is supported.');
    return true;
  } catch (error) {
    const err: BusinessError = error as BusinessError;
    Logger.error(`current auth trust level is not supported, code is ${err?.code}, message is ${err?.message}`);
    return false;
  }
}

示例2:

发起用户认证,采用认证可信等级≥ATL3的人脸+认证类型相关+复用设备解锁最大有效时长认证,获取认证结果。

initiatingUserAuthentication2() {
  // 设置认证参数
  let reuseUnlockResult: userAuth.ReuseUnlockResult = {
    reuseMode: userAuth.ReuseMode.AUTH_TYPE_RELEVANT,
    reuseDuration: userAuth.MAX_ALLOWABLE_REUSE_DURATION,
  };
  try {
    const randData = getRandData();
    if (!randData) {
      return;
    }
    const authParam: userAuth.AuthParam = {
      challenge: randData,
      authType: [userAuth.UserAuthType.PIN, userAuth.UserAuthType.FACE, userAuth.UserAuthType.FINGERPRINT],
      authTrustLevel: userAuth.AuthTrustLevel.ATL3,
      reuseUnlockResult: reuseUnlockResult,
    };
    // 配置认证界面
    const widgetParam: userAuth.WidgetParam = {
      title: resourceToString($r('app.string.title')),
    };
    // 获取认证对象
    const userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam);
    Logger.info('get userAuth instance successfully.');
    // 订阅认证结果
    userAuthInstance.on('result', {
      onResult: (result: userAuth.UserAuthResult) => {
        try {
          Logger.info('userAuthInstance callback.');
          this.result[ResultIndex.EXAMPLE_2] = (`${result.result}`);
          // 可在认证结束或其他业务需要场景,取消订阅认证结果。
          userAuthInstance.off('result');
        } catch (error) {
          const err: BusinessError = error as BusinessError;
          Logger.error(`onResult failed, code: ${err?.code}, Message: ${err?.message}`);
        }
      }
    });
    // 启动认证
    userAuthInstance.start();
    Logger.info('auth start successfully.');
  } catch (error) {
    const err: BusinessError = error as BusinessError;
    Logger.error(`auth failed, code is ${err?.code}, message is ${err?.message}`);
  }
}

三、实战

效果图

设备录入面容进行人脸识别效果


在这里插入图片描述
在这里插入图片描述

设备没有录入面容进行人脸识别效果


在这里插入图片描述
在这里插入图片描述

示例代码
TestUserAuthInstance2.ets

import { userAuth } from '@kit.UserAuthenticationKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { JSON } from '@kit.ArkTS';


function getRandData(): Uint8Array | null {
  try {
    const rand = cryptoFramework.createRandom();
    const len: number = 16;
    let randData: Uint8Array | null = null;
    let retryCount = 0;
    while (retryCount < 3) {
      randData = rand?.generateRandomSync(len)?.data;
      if (randData) {
        break;
      }
      retryCount++;
    }
    return randData;
  } catch (error) {
    const err: BusinessError = error as BusinessError;
    console.error(`getRandData error, code is ${err?.code}, message is ${err?.message}`);
    return null;
  }
}

@Entry
@Component
struct TestUserAuthInstance2 {
  @State message: string = '请面容解锁后查看下面的信息';
  @State lookData: boolean = false;
  @State result: string[] = new Array(8).fill('wait');

  /**
   * 以查询设备是否支持认证可信等级≥ATL3的人脸认证功能为例
   *
   * @returns
   */
  obtainingSupported() {
    try {
      // 查询认证能力是否支持
      userAuth.getAvailableStatus(userAuth.UserAuthType.FACE, userAuth.AuthTrustLevel.ATL3);
      console.info('当前设备 支持 current auth trust level is supported.');
      return true;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(
        `当前设备 不支持 current auth trust level is not supported, code is ${err?.code}, message is ${err?.message}`);
      return false;
    }
  }

  /**
   * 发起用户认证,采用认证可信等级≥ATL3的人脸+指纹+锁屏口令认证,获取认证结果。
   */
  initiatingUserAuthentication1() {
    try {
      const randData = getRandData();
      if (!randData) {
        return;
      }
      // 设置认证参数
      const authParam: userAuth.AuthParam = {
        challenge: randData,
        // authType: [userAuth.UserAuthType.PIN, userAuth.UserAuthType.FACE, userAuth.UserAuthType.FINGERPRINT],
        authType: [userAuth.UserAuthType.FACE],
        authTrustLevel: userAuth.AuthTrustLevel.ATL3,
      };
      // 配置认证界面
      const widgetParam: userAuth.WidgetParam = {
        title: "面容解锁",
      };
      // 获取认证对象
      const userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam);
      console.info('获取认证对象 get userAuth instance successfully.');
      // 订阅认证结果
      userAuthInstance.on('result', {
        onResult: (result: userAuth.UserAuthResult) => {
          try {
            console.info('订阅认证结果 userAuthInstance callback.' + JSON.stringify(result));
          //认证结果。包含认证结果码、认证令牌(成功时)、认证类型和凭据状态等信息。应用应检查result.result字段判断认证是否成功:
            //
            // - 若result.result为SUCCESS(12500000),表示认证通过,可使用result.token进行后续操作。
            //
            // - 若result.result为其他值,表示认证不通过,应根据具体错误码进行处理。
            if (result.result === 12500000) {
              this.lookData = true
            } else {
              this.lookData = true
            }
            // 可在认证结束或其他业务需要场景,取消订阅认证结果。
            userAuthInstance.off('result');
          } catch (error) {
            const err: BusinessError = error as BusinessError;
            console.error(`认证失败 onResult failed, code: ${err?.code}, Message: ${err?.message}`);
          }
        }
      });
      // 启动认证
      userAuthInstance.start();
      console.info('启动认证 auth start successfully.');
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`启动认证 auth failed, code is ${err?.code}, message is ${err?.message}`);
    }
  }

  build() {
    Column({ space: 30 }) {
      Text(this.message)
        .margin({ top: 50 })
        .fontSize($r('app.float.text_size_18fp'))
        .onClick(() => {
          let obtainingSupported = this.obtainingSupported();
          if (obtainingSupported) {
            this.initiatingUserAuthentication1()
          } else {
            promptAction.openToast({ message: "当前设备不支持面容解锁", duration: 5000})
          }
        })

      Text("个人信息相关数据")
        .fontSize(20)
        .fontColor(Color.Black)
        .visibility(this.lookData ? Visibility.Visible : Visibility.None)
    }
    .height('100%')
    .width('100%')
  }
}

entry里module.json5,申请权限

 "requestPermissions": [
      {
      		"name": "ohos.permission.ACCESS_BIOMETRIC",
        "reason": "$string:reason"
      }
 ]
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐