用户认证模块的定义
用户认证模块提供用户认证能力,对应用开发者而言,可使用该模块进行用户身份认证,用于设备解锁、支付、应用登录等身份认证场景。
当前用户认证提供人脸识别和指纹识别能力,设备具备哪种识别能力,取决于当前设备的硬件能力和技术实现。
基本概念
-
人脸识别:基于人的脸部特征信息进行身份识别的一种生物特征识别技术,用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别,通常也叫做人像识别、面部识别、人脸认证。
-
指纹识别:基于人的指尖皮肤纹路进行身份识别的一种生物特征识别技术。当用户触摸指纹采集器件时,器件感知并获取到用户的指纹图像,然后传输到指纹识别模块进行一定的处理后与用户预先注册的指纹信息进行比对,从而识别出用户身份。
场景介绍
当前用户认证支持Pin码认证、人脸识别和指纹识别,可应用于设备解锁、应用登录、支付等身份认证场景。
User Authentication Kit用户认证
1、查询当前设备是否支持相应的认证能力
开发步骤
-
申请权限。调用getAvailableStatus接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_BIOMETRIC权限。更多配置信息请参考Stage模型应用程序包结构。
-
指定认证类型和认证等级,调用getAvailableStatus接口查询当前的设备是否支持相应的认证能力。
配置权限
module.json5文件中:
"requestPermissions": [
// User Authentication Kit(用户认证服务)
// 用户认证权限,指纹,密码,面容
{
"name": "ohos.permission.ACCESS_BIOMETRIC"
}
]
调用getAvailableStatus接口
getAvailableStatus(authType : UserAuthType, authTrustLevel : AuthTrustLevel) : number
参数
实现代码:
// 认证类型参数 pravite authType: userAuth.UserAuthType[] = [ userAuth.UserAuthType.PIN, // PIN密码(模拟器支持) userAuth.UserAuthType.FINGERPRINT, // 指纹 userAuth.UserAuthType.FACE// 面容ID ] // 认证信任等级参数 pravite authTrustLevel: userAuth.AuthTrustLevel = userAuth.AuthTrustLevel.ATL3
// 查询认证能力是否支持,同时检测多项能力,有一项支持即可 checkUserAuthSupport() { const authTypeRes = this.authType.map((item) => { try {// 查询认证能力是否支持,使用 try catch捕获错误 userAuth.getAvailableStatus(item, this.authTrustLevel) return true } catch { return false } }) // 有一项支持即可 return authTypeRes.some(v => v === true)//some返回值是布尔值 }
2、执行认证操作并订阅认证结果
开发步骤
-
申请权限。调用start接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_BIOMETRIC权限。更多配置信息请参考Stage模型应用程序包结构。
-
调用on接口订阅认证结果。
代码实现
// 1配置认证参数 const authParam: userAuth.AuthParam = { challenge: new Uint8Array([49, 49, 49, 49, 49, 49]),// 挑战值,用来防重放攻击。 authType: UserAuthManager.authType,// 认证类型列表 authTrustLevel: UserAuthManager.authTrustLevel// 认证信任等级 };
// 2配置认证界面参数 const widgetParam: userAuth.WidgetParam = { title: '请进行身份认证', //认证时提示的标题内容 };
// 3获取认证对象实例 let userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam); // 4订阅认证结果 userAuthInstance.on('result', { onResult(result) { console.log('result---实例结果是' + JSON.stringify(result)); // 最终认证的结果 if (result.result === 12500000) { resolve(true) } else { resolve(false) } // 5取消订阅认证结果 userAuthInstance.off('result'); } }); // 6开始启动订阅认证 userAuthInstance.start();
封装用户认证管理类
主要定义了两个方法:
1、检测当前设备是否支持相应的能力:checkUserAuthSupport()
注意:如果检测结果为不支持需要引导用户去设置页开启相关指纹/面容验证
2、开启订阅认证:StartUserAuth()
具体在ArkTs文件实现:
import { userAuth } from '@kit.UserAuthenticationKit'//用户认证能力
import { promptAction } from '@kit.ArkUI'//弹窗
import { BusinessError } from '@kit.BasicServicesKit'//错误类型
// User Authentication Kit用户认证
// 场景介绍:当前用户认证支持人脸识别和指纹识别,可应用于设备解锁、应用登录、支付等身份认证场景。
//用户认证管理封装类
export class UserAuthManager {
// 认证类型列表
static authType: userAuth.UserAuthType[] = [
userAuth.UserAuthType.PIN, // PIN密码(模拟器支持)
userAuth.UserAuthType.FINGERPRINT, // 指纹
userAuth.UserAuthType.FACE// 面容ID
]
// 认证信任等级
static authTrustLevel: userAuth.AuthTrustLevel = userAuth.AuthTrustLevel.ATL3
// 查询认证能力是否支持,同时检测多项能力,有一项支持即可
static checkUserAuthSupport() {
const authTypeRes = UserAuthManager.authType.map((item) => {
try {
// 查询认证能力是否支持,注意这里需要用 try catch
userAuth.getAvailableStatus(item, UserAuthManager.authTrustLevel)
return true
} catch {
return false
}
})
// 有一项支持即可
return authTypeRes.some(v => v === true)//some返回值是布尔值
}
//进行用户认证订阅
static StartUserAuth(): Promise<boolean> {
return new Promise((resolve) => {
// 设置认证参数
const authParam: userAuth.AuthParam = {
challenge: new Uint8Array([49, 49, 49, 49, 49, 49]),// 挑战值,用来防重放攻击。
authType: UserAuthManager.authType,// 认证类型列表
authTrustLevel: UserAuthManager.authTrustLevel// 认证信任等级
};
// 配置认证界面
const widgetParam: userAuth.WidgetParam = {
title: '请进行身份认证', //认证时提示的标题内容
};
try {
// 获取认证对象实例
let userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam);
console.log('1result---获取用户认证实例成功,开启userAuthInstance.on事件订阅认证结果');
// 订阅认证结果
userAuthInstance.on('result', {
onResult(result) {
console.log('3result---实例结果是' + JSON.stringify(result));
// 最终认证的结果
if (result.result === 12500000) {
resolve(true)
} else {
resolve(false)
}
// 取消订阅认证结果
userAuthInstance.off('result');
}
});
console.log('2result---调用userAuthInstance.start开启订阅认证');
// 启动订阅认证
userAuthInstance.start();
} catch (error) {
const err: BusinessError = error as BusinessError;
promptAction.showToast({ message: '验证出错' + err.message })
}
})
}
}