打造用户认证系统,构筑信息安全防线

在当今的数字化时代,信息安全和用户隐私保护变得越来越重要。用户身份认证是确保信息安全的第一道防线。通过验证用户身份,可以防止未经授权的访问和数据泄露。它有助于保护用户的个人信息、账户资金和其他敏感数据。此外,用户身份认证还可以提高系统的安全性,减少恶意行为和欺诈事件的发生。

HarmonyOS SDK用户认证服务(User Authentication Kit)提供了基于用户在设备本地注册的锁屏口令、人脸和指纹来认证用户身份的能力,并提供了多设备统一的、集多种认证方式(人脸、指纹、口令)于一体的系统级用户身份认证控件。用户身份认证可用于各种鉴权场景,如应用内账号登录、支付认证等。

image

开发准备

申请权限

在开发具备用户身份认证的应用前,需要先申请权限ohos.permission.ACCESS_BIOMETRIC,应用才能使用生物特征识别能力(如人脸、指纹)进行身份认证。
该权限授权方式为system_grant(系统授权),开发者只需要在module.json5配置文件的requestPermissions标签中声明权限,即可获取系统授权。具体声明指导请参考申请应用权限-声明权限。

开发步骤

查询支持的认证能力

指定认证类型(UserAuthType)和认证等级(AuthTrustLevel),调用getAvailableStatus接口查询当前的设备是否支持相应的认证能力。

认证等级ATL的选择参见下表:

image

以查询设备是否支持认证可信等级≥ATL1的人脸认证功能为例:

import { BusinessError } from  '@kit.BasicServicesKit';
import { userAuth } from '@kit.UserAuthenticationKit';// 查询认证能力是否支持
try {    userAuth.getAvailableStatus(userAuth.UserAuthType.FACE, userAuth.AuthTrustLevel.ATL1);    console.info('current auth trust level is supported');
} catch (error) {const err: BusinessError = error as BusinessError;console.error(`current auth trust level is not supported. Code is ${err?.code}, message is ${err?.message}`);
}

发起认证

1.指定用户认证相关参数AuthParam(包括挑战值、认证类型UserAuthType列表和认证等级AuthTrustLevel)、配置认证控件界面WidgetParam,调用getUserAuthInstance获取认证对象。

2.调用UserAuthInstance.on接口订阅认证结果。

3.调用UserAuthInstance.start接口发起认证,通过IAuthCallback回调返回认证结果UserAuthResult。

当认证成功时返回认证通过类型(UserAuthType)和令牌信息(AuthToken)。

示例1:

发起用户认证,采用认证可信等级≥ATL3的人脸+锁屏密码认证,获取认证结果:

// API version 10
import { BusinessError } from '@kit.BasicServicesKit';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { userAuth } from '@kit.UserAuthenticationKit';try {const rand = cryptoFramework.createRandom();const len: number = 16;const randData: Uint8Array = rand?.generateRandomSync(len)?.data;// 设置认证参数const authParam: userAuth.AuthParam = {challenge: randData,authType: [userAuth.UserAuthType.PIN, userAuth.UserAuthType.FACE],authTrustLevel: userAuth.AuthTrustLevel.ATL3,};// 配置认证界面const widgetParam: userAuth.WidgetParam = {title: '请进行身份认证',};// 获取认证对象const userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam);console.info('get userAuth instance success');// 订阅认证结果userAuthInstance.on('result', {onResult(result) {console.info(`userAuthInstance callback result: ${JSON.stringify(result)}`);// 可在认证结束或其他业务需要场景,取消订阅认证结果userAuthInstance.off('result');}});console.info('auth on success');userAuthInstance.start();console.info('auth start success');
} catch (error) {const err: BusinessError = error as BusinessError;console.error(`auth catch error. Code is ${err?.code}, message is ${err?.message}`);
}

示例2:

发起用户认证,采用认证可信等级≥ATL3的人脸 + 认证类型相关 + 复用设备解锁最大有效时长认证,获取认证结果:

// API version 10
import { BusinessError } from  '@kit.BasicServicesKit';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { userAuth } from '@kit.UserAuthenticationKit';// 设置认证参数
let reuseUnlockResult: userAuth.ReuseUnlockResult = {reuseMode: userAuth.ReuseMode.AUTH_TYPE_RELEVANT,reuseDuration: userAuth.MAX_ALLOWABLE_REUSE_DURATION,
}
try {const rand = cryptoFramework.createRandom();const len: number = 16;const randData: Uint8Array = rand?.generateRandomSync(len)?.data;const authParam: userAuth.AuthParam = {challenge: randData,authType: [userAuth.UserAuthType.FACE],authTrustLevel: userAuth.AuthTrustLevel.ATL3,reuseUnlockResult: reuseUnlockResult,};// 配置认证界面const widgetParam: userAuth.WidgetParam = {title: '请进行身份认证',};// 获取认证对象const userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam);console.info('get userAuth instance success');// 订阅认证结果userAuthInstance.on('result', {onResult(result) {console.info(`userAuthInstance callback result: ${JSON.stringify(result)}`);// 可在认证结束或其他业务需要场景,取消订阅认证结果userAuthInstance.off('result');}});console.info('auth on success');userAuthInstance.start();console.info('auth start success');
} catch (error) {const err: BusinessError = error as BusinessError;console.error(`auth catch error. Code is ${err?.code}, message is ${err?.message}`);
}

认证过程中取消认证

1.指定用户认证相关参数AuthParam(包括挑战值、认证类型UserAuthType列表和认证等级AuthTrustLevel),获取认证对象UserAuthInstance,并调用UserAuthInstance.start发起认证。

2.通过使用已经成功发起认证的UserAuthInstance对象调用UserAuthInstance.cancel接口取消本次认证。

示例代码为发起认证可信等级≥ATL3的人脸+锁屏密码认证后,取消认证请求:

import { BusinessError } from  '@kit.BasicServicesKit';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { userAuth } from '@kit.UserAuthenticationKit';try {const rand = cryptoFramework.createRandom();const len: number = 16;const randData: Uint8Array = rand?.generateRandomSync(len)?.data;// 设置认证参数const authParam: userAuth.AuthParam = {challenge: randData,authType: [userAuth.UserAuthType.PIN, userAuth.UserAuthType.FACE],authTrustLevel: userAuth.AuthTrustLevel.ATL3,};// 配置认证界面const widgetParam: userAuth.WidgetParam = {title: '请进行身份认证',};// 获取认证对象const userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam);console.log('get userAuth instance success');// 开始认证userAuthInstance.start();console.log('auth start success');// 取消认证userAuthInstance.cancel();console.log('auth cancel success');
} catch (error) {const err: BusinessError = error as BusinessError;console.error(`auth catch error. Code is ${err?.code}, message is ${err?.message}`);
}

切换自定义认证

针对需要切换自定义认证方式的场景,发起认证请求的方式请参考发起认证,但在传入的widgetParam需包含字段navigationButtonText。

当前示例仅展示如何配置界面、选择切换到自定义认证界面,具体拉起的页面及对应页面的实现,请开发者自行实现,代码插入位置可参考注释提示。

import { BusinessError } from  '@kit.BasicServicesKit';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { userAuth } from '@kit.UserAuthenticationKit';try {const rand = cryptoFramework.createRandom();const len: number = 16;const randData: Uint8Array = rand?.generateRandomSync(len)?.data;const authParam: userAuth.AuthParam = {challenge: randData,authType: [userAuth.UserAuthType.FACE],authTrustLevel: userAuth.AuthTrustLevel.ATL3,};// 配置认证界面需设置navigationButtonTextconst widgetParam: userAuth.WidgetParam = {title: '请验证身份',navigationButtonText: '使用密码',};// 获取认证对象const userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam);console.log('get userAuth instance success');// 订阅认证结果userAuthInstance.on('result', {onResult(result) {// 若收到ResultCode值为12500000,代表操作成功console.log('userAuthInstance callback result = ' + JSON.stringify(result));// 若收到ResultCode值为12500011,说明用户点击了导航按钮想切换自定义认证方式if (result.result == 12500011) {//请开发者自行完成拉起自定义认证界面的实现}}});console.log('auth on success');userAuthInstance.start();console.log('auth start success');
} catch (error) {const err: BusinessError = error as BusinessError;console.error(`auth catch error. Code is ${err?.code}, message is ${err?.message}`);
}

查询用户注册凭据的状态

指定认证类型(UserAuthType),调用getEnrolledState接口查询用户注册凭据的状态。

以查询用户人脸注册凭据的状态为例:

import { BusinessError } from  '@kit.BasicServicesKit';
import { userAuth } from '@kit.UserAuthenticationKit';try {let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FACE);console.info(`get current enrolled state success, enrolledState: ${JSON.stringify(enrolledState)}`);
} catch (error) {const err: BusinessError = error as BusinessError;console.error(`get current enrolled state failed, Code is ${err?.code}, message is ${err?.message}`);
}

了解更多详情>>

访问用户认证服务联盟官网

获取用户认证服务开发指导文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907738.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LAN网的搭建

1 此下列三台主机都在局域网内,不涉及和ISP的Internet网络连接 2 以下三台主机,每台主机都各自有两个网卡,一个是无线网卡,一个是有线网卡。注:有线网卡和无线网卡通用,都可以既连接WAN又可以连接以太网(LAN局域网)。3 [Acer laptop] [Dell mini …

UML用例图-UML Use Case Diagram

用例图是UML中最简单,使用最高频的图之一,它通常用于诠释“这个软件做了什么”。用例图的的表达非常简单并且通俗易懂,不论研发、产品、测试,还是完全不懂软件的外行,用例图基本都能被看懂。.wj_nav { display: inline-block; width: 100%; margin-top: 0; margin-bottom:…

喜提好人卡?混元模型模块独立维护与开源发布

接着我们上次向Spring AI提交的混元模型模块,我已经完成了所有关于混元的聊天对接,并提交了相应的PR描述。提交后,荣获了一张“好人卡”,如图所示:今天,我们决定将之前提交给Spring AI官方的PR重新拿出来,并准备将其独立维护在一个开源仓库中。做出这一决策的原因是Spri…

VMware Aria Automation 8.18.1 新增功能简介

VMware Aria Automation 8.18.1 新增功能简介VMware Aria Automation 8.18.1 - 多云基础架构自动化平台 Multi-Cloud Infrastructure Automation Platform 请访问原文链接:https://sysin.org/blog/vmware-aria-automation/ 查看最新版。原创作品,转载请保留出处。 作者主页:…

最小二乘及最小二乘法系统辨识

目录一般最小二乘法加权最小二乘递推最小二乘 一般最小二乘法 无需每次对整体数据进行最小二乘估计,利用上次计算的值与当前数据融合计算,获取计算结果。本质上是对老的计算结果修正的方式,节省计算步骤,降低运算量,提升计算的效率。 若辨识模型: \[z_{(k)}={h_{(k)}}^T\…

氩气保护焊接气体流量控制

该节气装置通过以下方法,为您减少30%-50%的焊接气体的用量。在整个焊接过程中,气流与焊接电流自动同步调节。 “较大电流 — 较多气体/较小电流 — 较少气体”极高速气阀即使在焊接停止时间很短的情况下,也可开闭。通过持续的气体保护以及预先“编程”,脉冲气体可进一步减小…

2025.3.29日 清华大学-郝泽旭 的模拟赛

2025.3.29日 清华大学-郝泽旭 的模拟赛原题可以转化为给定了 \(k\) 个起点,求 \(k\) 个终点,使得路径两两无公共点的所有路径之和的最大值。 注意到先上再下的路径可以拆成两部分,即从关键点开始先向上到达一个点后再向下可以看作一条从关键点向上的路径与一条从非关键点向上…

DDL转换,一键导出表结构,生成DDL语句【转载】

源代码:https://gitee.com/wsitm/RuoYi-RDBMS 一、驱动管理驱动管理功能,用户能够上传并配置各类数据库驱动包。无论是常见的MySQL、Oracle、PostgreSQL、SQL Server,还是更多小众的数据库类型,只需上传相应的驱动包,即可迅速完成配置。 这一功能不仅简化了驱动安装与更新…

库卡机器人维修KSS26045硬件错误维修

库卡机器人在使用过程中,可能会遇到常见的KSS26045硬件故障,这些机器人故障大致可以归结为以下几种类型: 先是电源故障。一旦电源系统出现问题,库卡机器人可能会面临无法启动或无法维持正常运行的困境。为了诊断电源故障,可以利用万用表等专业工具来精确测量电源的输出电压…

PHP历理 精准处理数学表达式中的小数末尾零

<?php /*** 精准处理数学表达式中的小数末尾零* @param string $expression 原始数学表达式* @return string 处理后的规范表达式*/ function formatMathExpression(string $expression): string {// 正则匹配所有小数(包含整数部分和小数部分)return preg_replace_callb…

判断 Python 代码是不是 AI写的几个简单方法

作者:Laurel W来源:Adobe作为一名数据科学和数学老师,我其实不介意我的学生使用像 ChatGPT 这样的 LLM,只要它是用来辅助他们学习,而不是取代学习过程。加州理工学院的申请文书指南启发了我为编程和机器学习课制定 AI 使用政策: 哪些是加州理工申请文书中不道德的 AI 使用…

Golang学习Ⅱ

iota,函数多返回值,init函数,import导包 常量定义方式:const a int = 10; const{ a=10 b=20 }1 const{ 2 BeiJing = iota*10 //iota为0 3 ShangHai 4 NanJing 5 } //使用const定义枚举,BeiJing为0,ShangHai为10,NanJing为20View Code