目录

如何通过指纹登录

问题现象

对于支持指纹验证的设备,如何实现指纹登录?

背景知识

解决方案

  1. 在手机设置中录入个人指纹,完成指纹验证功能设置。
  2. 在对应模块的module.json5文件中找到requestPermissions字段配置ohos.permission.ACCESS_BIOMETRIC权限。
    {
      "name": "ohos.permission.ACCESS_BIOMETRIC"
    },
  3. 查询认证能力是否支持,需要根据错误码的不同,给予用户不同的提示。
    // 查询认证能力是否支持。
    try {
      userAuth.getAvailableStatus(userAuth.UserAuthType.FINGERPRINT, userAuth.AuthTrustLevel.ATL3);
      console.info('current auth trust level is supported');
      this.isAvi = true;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      this.isAvi = false;
      console.error(`current auth trust level is not supported. Code is ${err?.code}, message is ${err?.message}`);
    }
  4. 使用嵌入式用户身份认证控件。
    UserAuthIcon({
      authParam: this.authParam,
      widgetParam: this.widgetParam,
      iconHeight: 200,
      iconColor: this.isAvi ? Color.Blue : Color.Red,
      onIconClick: () => {
        console.info('The user clicked the icon.');
      },
      onAuthResult: (result: userAuth.UserAuthResult) => {
        console.info(`Get user auth result, result = ${JSON.stringify(result.result)}`);
        if (result.result === 12500000) {
          setTimeout(() => {
            this.isPassUserAuth = true;
          }, 1000);
        }
      }
    }).alignSelf(ItemAlign.Center);

完整示例参考如下:

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { userAuth, UserAuthIcon } from '@kit.UserAuthenticationKit';
import { BusinessError } from '@kit.BasicServicesKit';


@Entry
@Component
struct UserAuth {
  rand = cryptoFramework.createRandom();
  len: number = 16;
  randData: Uint8Array = this.rand?.generateRandomSync(this.len)?.data;
  authParam: userAuth.AuthParam = {
    challenge: this.randData,
    authType: [userAuth.UserAuthType.FINGERPRINT],
    authTrustLevel: userAuth.AuthTrustLevel.ATL3
  };
  widgetParam: userAuth.WidgetParam = {
    title: '请进行身份认证'
  };
  @State isPassUserAuth: boolean = false;
  private isAvi: boolean = false;

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

  aboutToAppear(): void {
    this.checkFinger();
  }

  build() {
    Row() {
      Column() {
        if (!this.isAvi) {
          Text('请录入指纹或者请确认设备支持指纹登录').fontSize(30).fontColor(Color.Red);
        } else {
          if (!this.isPassUserAuth) {
            UserAuthIcon({
              authParam: this.authParam,
              widgetParam: this.widgetParam,
              iconHeight: 200,
              iconColor: this.isAvi ? Color.Blue : Color.Red,
              onIconClick: () => {
                console.info('The user clicked the icon.');
              },
              onAuthResult: (result: userAuth.UserAuthResult) => {
                console.info(`Get user auth result, result = ${JSON.stringify(result.result)}`);
                if (result.result === 12500000) {
                  setTimeout(() => {
                    this.isPassUserAuth = true;
                  }, 1000);
                }
              }
            }).alignSelf(ItemAlign.Center);
          } else {
            Column() {
              Image($r('app.media.startIcon')).width(30);
              Text('主页').fontSize(30);
            }.width('100%');
          }
        }
      }.justifyContent(FlexAlign.Center);
    }.width('100%').height('100%').justifyContent(FlexAlign.Center);
  }
}

常见FAQ

Q:HarmonyOS在不用User Authentication Kit的情况下,系统有没有提供自定义认证界面底层的认证逻辑开发相关能力?

A:User Authentication Kit(用户认证服务)提供了系统级多设备统一的、集多种认证方式于一体的系统级用户身份认证控件。HarmonyOS屏蔽不同认证因子的差异,实现调用锁屏口令、人脸、指纹认证的接口归一,并不提供单独的身份认证接口。若伙伴有自定义认证界面的需求,具体认证逻辑需自行实现。

Q:使用ArkUI-X进行跨平台开发,可否使用Authentication相关接口实现登录功能?

A:安全认证Authentication相关的接口实现登录功能,当前是不支持跨平台的,需改用标准登录。