鸿蒙用户认证
温馨提示:本文最后更新于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()