HarmonyOS鸿蒙开发指南:基于ArkTS开发 用户认证

发布时间:2024年01月11日

目录

用户认证开发概述

基本概念

运作机制

约束与限制

用户认证开发指导

场景介绍

接口说明

开发步骤


用户认证开发概述

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

当前用户认证提供人脸识别和指纹识别能力,设备具备哪种识别能力,取决于设备的硬件能力和技术实现。

基本概念

  • 人脸识别:基于人的脸部特征信息进行身份识别的一种生物特征识别技术,用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别,通常也叫做人像识别、面部识别、人脸认证。
  • 指纹识别:基于人的指尖皮肤纹路进行身份识别的一种生物识别技术。当用户触摸指纹采集器件时,器件感知并获取到用户的指纹图像,然后传输到指纹识别模块进行一定的处理后与用户预先注册的指纹信息进行比对,从而识别出用户身份。

运作机制

人脸或指纹识别过程中,特征采集器件和TEE(Trusted Execution Environment)之间会建立安全通道,将采集的生物特征信息直接通过安全通道传递到TEE中,从而避免了恶意软件从REE(Rich Execution Environment)侧进行攻击。传输到TEE中的生物特征数据从活体检测、特征提取、特征存储、特征比对到特征销毁等处理都完全在TEE中完成,基于TrustZone进行安全隔离,提供API的服务框架只负责管理认证请求和处理认证结果等数据,不涉及生物特征数据本身。

用户注册的生物特征数据在TEE的安全存储区进行存储,采用高强度的密码算法进行加密和完整性保护,外部无法获取到加密生物特征数据的密钥,保证了用户生物特征数据的安全性。本能力采集和存储的生物特征数据不会在用户未授权的情况下被传出TEE。这意味着,用户未授权时,无论是系统应用还是三方应用都无法获得人脸和指纹等特征数据,也无法将这些特征数据传送或备份到任何外部存储介质。

约束与限制

  • 当前版本提供的用户认证能力包含人脸识别和指纹识别,且只支持本地认证,不提供认证界面。
  • 要求设备上具备相应的生物特征采集器,且对于人脸识别要求人脸图像分辨率大于100*100。
  • 要求设备上具有TEE安全环境,人脸和指纹等生物特征信息高强度加密保存在TEE中。
  • 对于面部特征相似的人、面部特征不断发育的儿童,人脸特征匹配率有所不同。如果对此担忧,可考虑其他认证方式。

用户认证开发指导

场景介绍

当前用户认证支持人脸识别和指纹识别,可应用于设备解锁、应用登录、支付等身份认证场景。

接口说明

userIAM_userAuth模块提供了用户认证的相关方法,包括检测认证能力、认证和取消认证等,用户可以使用人脸、指纹等生物特征信息进行认证操作。

在执行认证前,需要检查设备是否支持该认证能力,具体指认证类型、认证等级。如果不支持,需要考虑使用其他认证能力。

表1?用户认证开放能力列表

接口名

功能描述

getVersion() : number

获取认证对象的版本信息。

getAvailableStatus(authType : UserAuthType, authTrustLevel : AuthTrustLevel) : number

根据指定的认证类型、认证等级,检测当前设备是否支持相应的认证能力。

auth(challenge: Uint8Array, authType: UserAuthType, authTrustLevel: AuthTrustLevel, callback: IUserAuthCallback): Uint8Array

执行用户认证,使用callback方式作为异步方法。

cancelAuth(contextID : Uint8Array) : number

通过contextID取消本次认证操作。

开发步骤

开发前请完成以下准备工作:

  1. 在应用配置权限文件中,增加ohos.permission.ACCESS_BIOMETRIC的权限声明。?
  2. 在使用用户认证能力的代码文件中增加import userIAM_userAuth from '@ohos.userIAM.userAuth'。?

开发过程:

  1. 获取Authenticator的单例对象,代码示例如下:

    let auth = new userIAM_userAuth.UserAuth();
    
  2. (可选)获取认证对象的版本信息,代码示例如下:

    let auth = new userIAM_userAuth.UserAuth();
    let version = auth.getVersion();
    console.info("auth version = " + version);
    
  3. 根据指定的认证类型、认证等级,检测当前设备是否支持相应的认证能力,代码示例如下:

    let auth = new userIAM_userAuth.UserAuth();
    let checkCode = auth.getAvailableStatus(userIAM_userAuth.UserAuthType.FACE, userIAM_userAuth.AuthTrustLevel.ATL1);
    if (checkCode == userIAM_userAuth.ResultCode.SUCCESS) {
    ? ? console.info("check auth support success");
    ? ? // 此处添加支持指定类型认证的逻辑
    } else {
    ? ? console.error("check auth support fail, code = " + checkCode);
    ? ? // 此处添加不支持指定类型认证的逻辑
    }
    
  4. 执行认证操作,代码示例如下:

    let auth = new userIAM_userAuth.UserAuth();
    auth.auth(null, userIAM_userAuth.UserAuthType.FACE, userIAM_userAuth.AuthTrustLevel.ATL1, {
    ? ? onResult: (result, extraInfo) => {
    ? ? ? ? try {
    ? ? ? ? ? ? console.info("auth onResult result = " + result);
    ? ? ? ? ? ? console.info("auth onResult extraInfo = " + JSON.stringify(extraInfo));
    ? ? ? ? ? ? if (result == 'SUCCESS') {
    ? ? ? ? ? ? ? ? // 此处添加认证成功逻辑
    ? ? ? ? ? ? } ?else {
    ? ? ? ? ? ? ? ? // 此处添加认证失败逻辑
    ? ? ? ? ? ? }
    ? ? ? ? } catch (e) {
    ? ? ? ? ? ? console.info("auth onResult error = " + e);
    ? ? ? ? }
    ? ? },
    
    ? ? onAcquireInfo: (module, acquire, extraInfo) => {
    ? ? ? ? try {
    ? ? ? ? ? ? console.info("auth onAcquireInfo module = " + module);
    ? ? ? ? ? ? console.info("auth onAcquireInfo acquire = " + acquire);
    ? ? ? ? ? ? console.info("auth onAcquireInfo extraInfo = " + JSON.stringify(extraInfo));
    ? ? ? ? } catch (e) {
    ? ? ? ? ? ? console.info("auth onAcquireInfo error = " + e);
    ? ? ? ? }
    ? ? }
    });
    
  5. 认证过程中取消认证,代码示例如下:

    let auth = new userIAM_userAuth.UserAuth();
    // contextId通过auth接口获取
    let contextId = auth.auth(null, userIAM_userAuth.UserAuthType.FACE, userIAM_userAuth.AuthTrustLevel.ATL1, {
    ? ? onResult: (result, extraInfo) => {
    ? ? ? ? console.info("auth onResult result = " + result);
    ? ? },
    
    ? ? onAcquireInfo: (module, acquire, extraInfo) => {
    ? ? ? ? console.info("auth onAcquireInfo module = " + module);
    ? ? }
    });
    let cancelCode = auth.cancel(contextId);
    if (cancelCode == userIAM_userAuth.ResultCode.SUCCESS) {
    ? ? console.info("cancel auth success");
    } else {
    ? ? console.error("cancel auth fail");
    }
    

文章来源:https://blog.csdn.net/m0_68036862/article/details/135502114
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。