首页 鸿蒙 正文
  • 本文约2805字,阅读需14分钟
  • 134
  • 0

鸿蒙用户认证

温馨提示:本文最后更新于2024年10月11日 08:15,若内容或图片失效,请在下方留言或联系博主。

提供用户认证能力,可应用于设备解锁、支付、应用登录等身份认证场景。

1. 查询认证能力是否支持(检查权限)

 try {
    userAuth.getAvailableStatus(
    userAuth.UserAuthType.PIN, // 手势密码 人脸识别 指纹
    userAuth.AuthTrustLevel.ATL1 // 四个认证等级 等级越高 人脸/指纹的识别越严格
       )
// 如果是 PIN的话 需要在模拟器设置页打开/设置 PIN 密码
    AlertDialog.show({ message: JSON.stringify('支持PIN', null, 2) })
      } catch (err) {
    AlertDialog.show({ message: JSON.stringify(err, null, 2) })
      }

2. 开始用户认证服务

starUserAuth(): Promise<boolean> {
    // 通过 promise 获取回调函数的返回结果
    return new Promise((resolve, reject) => {
      // 1.申请权限(module.json5 已经完成)
       // "name": "ohos.permission.ACCESS_BIOMETRIC"
      // 2. 获取用户认证的对象 指定用户认证相关参数 AuthParam
      const userAuthInstance = userAuth.getUserAuthInstance({
        challenge: new Uint8Array([1, 2, 3, 4, 5, 6]), // 挑战值 防破解 大家配置不同的挑战值即可
        authType: [// 认证类型
          userAuth.UserAuthType.FINGERPRINT, // 指纹解锁--优先级1
          userAuth.UserAuthType.FACE,  // 人脸识别--优先级2          
          userAuth.UserAuthType.PIN,  // 锁屏密码--优先级3
        ],
        authTrustLevel: userAuth.AuthTrustLevel.ATL3, // 认证等级 等级越高 人脸/指纹的识别越严格
      },
        {
          title: '请验证用户身份' // 认证控件标题(锁屏/指纹)
        })
      // 3. 返回订阅的结果
      // on 订阅指定类型的用户认证事件
      // 需要调用UserAuthInstance的start()接口,启动认证后,才能通过onResult获取到认证结果
      userAuthInstance.on('result', {
        onResult(result) {
          if (result.result == userAuth.UserAuthResultCode.SUCCESS) {
            resolve(true)
          } else {
            reject(false)
          }
          // 取消订阅
          // off 取消订阅特定类型的认证事件。
          userAuthInstance.off('result')
        }
      })
      // 4. 发起认证
      userAuthInstance.start()
    })
  }

可以通过 starUserAuth 的返回值 决定用户认证是否通过

完整封装后的代码:

import { userAuth } from '@kit.UserAuthenticationKit'

class UserAuthManager {
  // 认证信任等级
  private authTrustLevel: userAuth.AuthTrustLevel = userAuth.AuthTrustLevel.ATL3
  // 认证类型列表
  private authType: userAuth.UserAuthType[] = [
    userAuth.UserAuthType.FACE, // 面容ID 优先级1
    userAuth.UserAuthType.FINGERPRINT, // 指纹 优先级2
    userAuth.UserAuthType.PIN// PIN密码(模拟器支持)优先级3
  ]
  // 设置认证参数
  private authParam: userAuth.AuthParam = {
    challenge: new Uint8Array([49, 49, 49, 49, 49, 49]), // 挑战值,用来防重放攻击。
    authType: this.authType, // 认证类型列表
    authTrustLevel: this.authTrustLevel, // 认证信任等级
  }
  // 配置认证界面
  private widgetParam: userAuth.WidgetParam = {
    title: '请进行身份认证', // 用户认证界面的标题, 仅在 PIN/指纹 密码时展示
  }

  // 查询认证能力是否支持
  checkUserAuthSupport() {
    // map 遍历 会返回是否支持该认证能力的数组(布尔值)
    const statusList = this.authType.map(item => {
      try {
        // 检查能力是否支持(锁屏密码 / 安全等级三)
        userAuth.getAvailableStatus(item, this.authTrustLevel) // item 三个解锁
        return true
      } catch {
        return false
      }
    })
    // every 条件中 所有项为 true 结果才返回 true
    // some  条件中 有一项为 true 结果就返回 true
    // statusList 数组中是 [false,false,true] 有一个 true所以返回 true
    return statusList.some(v => v == true)
  }

  // 开始用户认证服务 通过 Promise 封装
  starUserAuth(): Promise<boolean> {
    // 通过 promise 获取回调函数的返回结果
    return new Promise((resolve, reject) => {
      // 1.申请权限(module.json5 已经完成)
      // 2. 获取用户认证的对象 指定用户认证相关参数 AuthParam
      const userAuthInstance = userAuth.getUserAuthInstance(this.authParam, this.widgetParam) // 认证参数(挑战值 类型 等级) 认证的提示
      // 3. 返回订阅的结果
      // on 订阅指定类型的用户认证事件
      // 需要调用UserAuthInstance的start()接口,启动认证后,才能通过onResult获取到认证结果
      userAuthInstance.on('result', {
        onResult(result) {
          if (result.result == userAuth.UserAuthResultCode.SUCCESS) {
            resolve(true)
          } else {
            reject(false)
          }
          // 取消订阅
          // off 取消订阅特定类型的认证事件。
          userAuthInstance.off('result')
        }
      })
      // 4. 发起认证
      userAuthInstance.start()
    })
  }
}
// 导出
export const userAuthManager = new UserAuthManager()
评论