本功能在6.1.1(24)之前版本仅在手机设备支持。对于6.1.1(24)及之后版本,本功能在手机设备、部分PC/2in1、部分Tablet设备支持。人脸认证功能仅支持具备3D人脸识别能力的设备,目前仅支持绑定一个指纹/人脸用于支付认证,且需企业开发者应用服务器端同步接入配合端云协同认证。通过用户认证服务提供的接口查询支持的认证能力,可确认设备是否支持3D人脸。
接口及使用方法请参见API参考。
| 接口名 | 描述 |
|---|---|
| trustedAuthentication(challenge: Uint8Array, authID: bigint, label: TUILable): Promise<AuthToken> | 数字盾密码认证 |
| getBiometricAuthToken(operType: OperateType, tuiAuthToken: Uint8Array, bioAuthToken: Uint8Array): Promise<AuthToken> | 获取生物特征绑定完成后生成的authToken信息。 |
导入huks 、userAuth 、trustedAuthentication和相关依赖模块。
import { resourceManager } from '@kit.LocalizationKit'
import { huks } from '@kit.UniversalKeystoreKit';
import { userAuth } from '@kit.UserAuthenticationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { trustedAuthentication } from '@kit.DeviceSecurityKit';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { common } from '@kit.AbilityKit'; 人脸认证功能需设备具备3D人脸识别能力,需通过用户认证服务提供的接口查询支持的认证能力确认设备是否支持3D人脸识别。
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;
}
} 通过用户认证服务提供的接口查询设备是否已录入相关凭证,如下示例为查询用户人脸注册凭据的状态。
obtainingEnrolledCredentialInformation() {
try {
let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FACE);
Logger.info('get current enrolled state successfully.');
return enrolledState.credentialDigest;
} catch (error) {
const err: BusinessError = error as BusinessError;
Logger.error(`get current enrolled state failed, code is ${err?.code}, message is ${err?.message}`);
return false;
}
} 参考密钥管理服务提供的签名/验签指导,初始化签名会话。
调用数字盾密码认证接口trustedAuthentication发起生物特征认证前的密码认证申请。
async PwdVerify(challenge: Uint8Array, assetName: string): Promise<trustedAuthentication.AuthToken> {
try {
let resArray: Uint8Array = await AssetUtils.QueryDataFromAssetStore(assetName);
let credentialID: bigint = CryptoUtils.uint8ArrayToBigInt(resArray);
const context = AppStorage.get('context') as Context;
const buffer: ArrayBuffer = await CryptoUtils.ImportImage();
const label: trustedAuthentication.TUILable = {
image: buffer,
title: context.resourceManager.getStringSync($r('app.string.ShieldPwVerification').id)
}
const result = await trustedAuthentication.trustedAuthentication(challenge, credentialID, label);
hilog.info(DOMAIN, 'testTag', 'DigitalShield password verification success:', result.authToken.length,
result.authToken);
return result;
} catch (error) {
hilog.error(DOMAIN, 'testTag', 'DigitalShield password verification failed:', error);
throw new Error('DigitalShield password verification failed:' + (error as BusinessError).message);
}
} 通过用户认证服务提供的接口,拉起生物特征认证控件并发起认证。
当订阅的生物认证结果获取到后,将数字盾密码认证结果和生物特征认证结果统一整合,发起生物特征绑定请求。
try {
let session = await TrustedAuth.SignInit();
hilog.info(DOMAIN, 'testTag', 'Finish Signature Initialization');
const tuiAuthToken: Uint8Array =
await TrustedAuth.GetTUIAuthTokenBeforeBioVerify('placeholder', session, TUI_BIND_FACE, 'pin_label1'); // 步骤6密码认证获取的authToken
let bioAuthToken: Uint8Array =
await TrustedAuth.UserAuthBeforeSign(session, TUI_BIND_FACE); // 步骤7生物特征认证获取的authToken
let operType = trustedAuthentication.OperateType.OPERATE_TYPE_BIOMETRIC_AUTH;
let resignAuthToken =
await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken);
let inputdata = 'placeholder';
await TrustedAuth.bindFaceID(session.handle, resignAuthToken.authToken, inputdata)
// ...
} catch (error) {
hilog.error(DOMAIN, 'testTag', 'Bind Face Fail:', error);
// ...
} 参考密钥管理服务提供的签名/验签指导, 对返回生物特征绑定对应的authToken数据进行签名,并结束会话。
企业开发者应用可将签名获取的生物特征进行验签校验,并将生物特征credential信息与账号信息在服务器端绑定。