HarmonyOS应用开发( Beta5.0)HOS-用户认证服务:面部识别

介绍

User Authentication Kit(用户认证服务)提供了基于用户在设备本地注册的人脸和指纹来认证用户身份的能力

用户向应用/系统服务请求访问某些个人数据或执行某些敏感操作时,应用/系统服务将调用系统用户身份认证控件对用户身份进行认证,认证通过后,才响应用户对于数据或敏感操作的执行请求。

用户身份认证可用于各种鉴权场景,如应用内账号登录、支付认证等。

#HarmonyOS NEXT体验官#梅科尔工作室HOS-用户认证服务:面部识别-鸿蒙开发者社区

效果预览

#HarmonyOS NEXT体验官#梅科尔工作室HOS-用户认证服务:面部识别-鸿蒙开发者社区

开发准备

1.在开发具备用户身份认证的应用前,需要先申请权限ohos.permission.ACCESS_BIOMETRIC,应用才能使用生物特征识别能力(如人脸、指纹)进行身份认证。

该权限授权方式为system_grant(系统授权),开发者只需要在module.json5配置文件的requestPermissions标签中声明权限,即可获取系统授权。

#HarmonyOS NEXT体验官#梅科尔工作室HOS-用户认证服务:面部识别-鸿蒙开发者社区


2.设备管理器中的虚拟机不支持指纹和人脸识别,验证开发效果需要烧录到真机(本试验效果预览用的是华为mate60)上进行测试

3.由于目前HarmonyOS系统不支持第三方录入指纹和人脸,需要在烧录的真机的手机设置里面自行录入指纹和人脸

#HarmonyOS NEXT体验官#梅科尔工作室HOS-用户认证服务:面部识别-鸿蒙开发者社区

实现思路

@ohos.userIAM.userAuthIcon (嵌入式用户身份认证控件)

主要功能:a.提供嵌入式的人脸、指纹认证控件图标,可被应用集成。
b.支持自定义图标的颜色和大小,但图标样式不可变更。

首先导入指纹、人脸认证控件模块;

接着通过AuthParam定义挑战值、认证类型列表、认证信任等级等用户认证参数;

定义之后在UserAuthIcon进行调用,同时可以在UserAuthIcon里的authParam调用用户认证参数, widgetParam定义用户认证的标题,iconHeight定义人脸/指纹控件图标的大小, iconColor定义人脸/指纹控件图标的颜色,onIconClick定义用户点击icon回调接口,onAuthResult用户认证结果信息回调接口。 需要权限: ohos.permission.ACCESS_BIOMETRIC

    import { userAuth, UserAuthIcon } from '@kit.UserAuthenticationKit';//导入模块@Entry@Componentstruct Index {authParamzhiwen: userAuth.AuthParam = {challenge: new Uint8Array([49, 49, 49, 49, 49, 49]),//挑战值。最大长度为32字节,可传Uint8Array([])。authType: [userAuth.UserAuthType.FACE, userAuth.UserAuthType.PIN],//认证类型列表:人脸认证和口令认证authTrustLevel: userAuth.AuthTrustLevel.ATL3//认证信任等级。};widgetParam: userAuth.WidgetParam = {title: '请进行身份认证'};build() {Row({space:20}){Column({space:15}){UserAuthIcon({authParam: this.authParamzhiwen,//前面配置的widgetParam: this.widgetParam,iconHeight: 70,//图标高度,可自定义iconColor: Color.Blue,//图标颜色,可自定义onIconClick: () => {console.info('The user clicked the icon.');},  // 需要调用UserAuthInstance的start()接口,启动认证后,才能通过onResult获取到认证结果。onAuthResult: (result: userAuth.UserAuthResult) => {console.info('Get user auth result, result = ' + JSON.stringify(result));}})}}}}

#HarmonyOS NEXT体验官#梅科尔工作室HOS-用户认证服务:面部识别-鸿蒙开发者社区

发起认证

1.申请权限:ohos.permission.ACCESS_BIOMETRIC。

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

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

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

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

        import { BusinessError } from '@kit.BasicServicesKit';import { userAuth } from '@kit.UserAuthenticationKit';// 设置认证参数const authParam: userAuth.AuthParam = {challenge: new Uint8Array([49, 49, 49, 49, 49, 49]),authType: [userAuth.UserAuthType.PIN, userAuth.UserAuthType.FACE],authTrustLevel: userAuth.AuthTrustLevel.ATL3,};// 配置认证界面const widgetParam: userAuth.WidgetParam = {title: '请进行身份认证',};try {// 获取认证对象let 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.申请权限:ohos.permission.ACCESS_BIOMETRIC。

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

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

        import { BusinessError } from  '@kit.BasicServicesKit';import { userAuth } from '@kit.UserAuthenticationKit';const authParam: userAuth.AuthParam = {challenge: new Uint8Array([49, 49, 49, 49, 49, 49]),authType: [userAuth.UserAuthType.PIN, userAuth.UserAuthType.FACE],authTrustLevel: userAuth.AuthTrustLevel.ATL3,};const widgetParam: userAuth.WidgetParam = {title: '请进行身份认证',};try {// 获取认证对象let 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}`);}

指纹识别开发整体代码

        import userIAM from '@ohos.userIAM.userAuth'import promptAction from '@ohos.promptAction'@Entry@Componentstruct FingerLoginPage {@State isOn:boolean = falsebuild() {Column() {Row(){Text(`指纹登录-${this.isOn?'开启':'未开启'}`)Toggle({ type: ToggleType.Switch, isOn: this.isOn }).selectedColor('#007DFF').switchPointColor('#FFFFFF').onChange((isOn: boolean) => {let that = thisthis.isOn = isOnif(isOn){if(canIUse('SystemCapability.UserIAM.UserAuth.Core')){console.error('设备支持指纹')/*** 获取认证对象*/let challenge = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);let authType = userIAM.userAuth.UserAuthType.FACE;let authTrustLevel = userIAM.AuthTrustLevel.ATL1;let authParam: userIAM.AuthParam = {challenge: challenge,authType: [authType],authTrustLevel: authTrustLevel,};let widgetParam:userIAM.WidgetParam = {title:'请验证指纹'}let auth:userIAM.UserAuthInstancetry {auth = userIAM.getUserAuthInstance(authParam,widgetParam)console.error("获取认证对象成功");/*** 订阅认证结果*/try {auth.on('result',{onResult(result){console.error('订阅认证结果result = ' + JSON.stringify(result));let resultNum:number = result.resultif(resultNum === 12500000){// 认证成功console.error("指纹认证成功");that.isOn = true}else if(resultNum === 12500001){// 认证失败console.error("指纹认证失败");that.isOn = false}else if(resultNum === 12500003){// 认证取消console.error("指纹认证取消");that.isOn = false}else if(resultNum === 12500010){// 用户未录入指纹console.error("用户未录入指纹");that.isOn = false}else{that.isOn = falseconsole.error('认证错误')}// 取消订阅认证结果try {auth.off("result");console.error("取消订阅认证结果成功");} catch (error) {that.isOn = falseconsole.error("取消订阅认证结果失败, error = " + error);}}});console.error("订阅认证结果成功");/*** 开始认证*/try {auth.start();console.error("开始认证");} catch (error) {console.error("开始认证失败:" + error);that.isOn = false}} catch (error) {that.isOn = falseconsole.error("订阅认证结果失败 " + error);}} catch (error) {that.isOn = falsepromptAction.showToast({message: '获取认证对象失败',duration: 1500});console.error("获取认证对象失败--" + error);}}else{that.isOn = falsepromptAction.showToast({message: '设备不支持指纹识别。。。',duration: 1500});}}})}.width('100%').height(50).margin({top:100}).justifyContent(FlexAlign.SpaceBetween)}.width('100%').height('100%').padding(10)}}

总结

经过一番努力,你现在已经是面部识别界的“武林高手”了!你不仅学会了如何让应用认出你的“盛世美颜”,还知道了如何优雅地处理那些想“蒙混过关”的脸庞。

想象一下,下次当你的朋友们惊讶地看着你的应用通过面部识别解锁时,你就可以自豪地说:“看,这就是我的‘刷脸’技术!”(别忘了提醒他们,这可不是普通的刷脸,而是高科技版的哦!)

好了,各位未来的“面部认证大师”,是时候展现你们真正的技术了!拿起你的键盘,开始你的表演吧!

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为体系杂乱无章,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

希望这一份鸿蒙学习文档能够给大家带来帮助~

GitCode - 全球开发者的开源社区,开源代码托管平台


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频教程+学习PDF文档

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

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

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

相关文章

MySQL之库和表操作

目录 一:对库的操作 1.创建数据库 2.查看数据库列表 3.显示创建数据库的语句 4.删除数据库 5.字符集与校验集 6.确认当前所处的数据库 7.修改数据库 8.备份和恢复 9.查看连接情况 二:对表的操作 1.创建表 2.查看表 3.删除表 4.修改表 接下来的日…

Java 设计模式-状态模式

目录 一. 概述 二. 主要角色 三. 代码示例 四. 优缺点 优点: 缺点: 五. 常见应用场景 一. 概述 状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定…

信息安全工程师(1)计算机网络分类

一、按分布范围分类 广域网(WAN): 定义:广域网的任务是提供长距离通信,运送主机所发送的数据。其覆盖范围通常是直径为几十千米到几千千米的区域,因此也被称为远程网。特点:连接广域网的各个结点…

利用高德+ArcGIS优雅获取任何感兴趣的矢量边界

荷花十里,清风鉴水,明月天衣。 四时之景不同,乐亦无穷尽也。今天呢,梧桐君给大家讲解一下,如何利用高德地图,随机所欲的获取shp边界数据。 文章主要分成以下几个步骤: 首先搜索你想获取的矢量…

【文献阅读】Unsupervised Machine Learning for Bot Detection on Twitter

Abstract 引入新特征,并降低所提模型的复杂性,从而提高基于聚类算法的机器人识别准确性。 最小化数据集维度和选择重要特征来实现的。 实验证明该方法的特征可以与四种不同的聚类技术(agglomerating、k-medoids、DBSCAN 和 K-means&#x…

企业数字化转型、建设和升级面临的主要难题和解决之道(2)

用爱编程30年,倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销,致力于为10000家的中小企业实现数字化转型,打造数字化企业和智能工厂,点击上边蓝色字体,关注“AI智造AI编程”或文末扫码…

rocm Linpack 编译构建系统解析

0. 购买amd显卡,安装rocm 1, 编译 rocHPL 下载源码: $ git clone --recursive https://github.com/ROCm/rocHPL.git 编译: $ cd rocHPL/ $ ./install.sh --prefix${PWD}/../local/ 会自动 git clone blit,ucx,opempi, $ ./mpirun_rochpl …

相互作用先验下的 3D 分子生成扩散模型 - IPDiff 评测

IPDiff 是一个基于蛋白质-配体相互作用先验引导的扩散模型,首次把配体-靶标蛋白相互作用引入到扩散模型的扩散和采样过程中,用于蛋白质(口袋)特异性的三维分子生成。 本文将对 IPDiff 实际的分子生成能力进行评测。 一、背景介绍 …

web基础之SSRF

1、内网访问 题目提示:访问位于127.0.0.1的flag.php;直接利用ssrf漏洞访问?url127.0.0.1/flag.php 2、伪协议读取文件 (1)题目提示:尝试去读取一下Web目录下的flag.php吧 (2)什么是伪协议&a…

AttackGen - AI 网络安全事件响应测试工具,附下载链接

为了提高我们团队在安全活动中的响应效率,我关注到了一款叫 AttackGen 的工具,我们需要的是一个既能快速生成场景又能准确反映现实威胁的工具。 在红蓝对抗中,我们经常要模拟各种攻击场景,以测试我们的防御水平。这不仅仅是为了“…

快排Java

快速排序的复杂度 快排代码 package leetcode;import java.util.Arrays;public class QuickSort {public static void quickSort(int[] array, int low, int high) {if (low < high) {int pivotIndex partition(array, low, high);quickSort(array, low, pivotIndex - 1);…

浙大数据结构:03-树2 List Leaves

这道题我借用了一点上一题的代码思路&#xff0c;这题考察的主要是层序遍历&#xff0c;即用队列来实现&#xff0c;当然此处我依然采用数组模拟队列来实现。 机翻 1、条件准备 map的键存下标&#xff0c;后面值分别存左右子树的下标&#xff0c;没有子树就存-1. head数组只…

Buzzer:一款针对eBPF的安全检测与模糊测试工具

关于Buzzer Buzzer是一款功能强大的模糊测试工具链&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员简单高效地开发针对eBPF的模糊测试策略。 功能介绍 下面给出的是当前版本的Buzzer整体架构&#xff1a; 元素解析&#xff1a; 1、ControlUnit&#xff1a…

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果&#xff1a; 解密后的数据就是正常数据&#xff1a; 后端&#xff1a;使用的是spring-cloud框架&#xff0c;在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30…

51单片机-AT24C02(IIC总线介绍及其时序编写步骤)-第一节(下一节实战)

IIC开始通信&#xff08;6大步&#xff09; 我以前的文章也有对基本常用的通信协议讲解&#xff0c;如SPI UART IIC RS232 RS485 CAN的讲解&#xff0c;可前往主页查询&#xff0c;&#xff08;2024.9.12,晚上20&#xff1a;53&#xff0c;将AT24C02存储芯片&#xff0c;掉电不…

charles配置安卓抓包(避坑版)

1. 下载Charleshttps://www.charlesproxy.com/ 2. 安装&#xff0c;疯狂点击下一步即可 3. 注册&#xff1a;打开Charles&#xff0c;选择“Help”菜单中的“Register Charles”&#xff0c;进网站生成密钥&#xff1a;https://www.zzzmode.com/mytools/charles/,将生成的密钥…

【Linux修行路】信号的产生

目录 ⛳️推荐 一、信号的产生 二、产生信号的系统调用 2.1 kill——给指定的进程发送指定的信号 2.2 模拟实现指令 kill 2.3 raise——给调用的进程发送指定的信号 2.4 abort——给调用者发送 6 号信号 三、验证哪些信号不可以被捕捉 四、为什么除0和解引用空指针会给…

【C++】——vector

文章目录 vector介绍vector的使用vector的构造vector迭代器vector空间增减vector增删查改 vector介绍 vector是一个动态数组&#xff0c;可以根据需求变大变小vector支持随机访问vector会自动管理内存分配和释放vector在尾部添加和删除的效率非常高&#xff0c;中间和头部插入较…

Leetcode面试经典150题-134.加油站

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {/**如果只有一个加油站&#xff0c;那它本来就在那个为止&#xff0c;0就是它的编号?但是这只是你的想象&#xff0c;题目有个变态规定&#xff0c;自…