华为HarmonyOS帮助应用实现在线认证服务 -- 2 FIDO免密身份认证

场景介绍

  • 开通FIDO免密身份认证功能,使用用户已有的生物特征开通FIDO免密身份认证能力。
  • 使用FIDO免密身份认证功能,使用用户已开通的生物特征进行FIDO免密身份认证。
  • 关闭FIDO免密身份认证功能,使用用户已开通的生物特征注销FIDO免密身份认证能力。

基本概念

在开发FIDO免密身份认证功能前,开发者应了解以下基本概念:

  • FIDO协议 FIDO(Fast Identity Online)是一套身份认证框架协议,它由FIDO联盟推出并持续维护。FIDO规范定义了一套在线身份认证的技术架构。

  • UAF身份认证框架 UAF(Universal Authentication Framework)意为通用身份认证框架,目的是通过生物识别(如指纹识别)和加密技术方式,为用户提供无密码的身份认证体验。

约束与限制

需满足以下条件,才能使用该功能。

  • 移动端设备需要支持生物特征(指纹/3D人脸)。
  • FIDO服务需要联网,以便提供完整的在线身份校验服务。应用在调用本服务API前,需将FIDO服务联网行为向用户明示,并且取得用户同意。

接口说明

业务进行FIDO免密身份认证功能的开通、使用和关闭。

接口名 描述
discover(context: common.Context): Promise<DiscoveryData> 发现设备的认证能力,返回当前设备软件支持的认证器数据
checkPolicy(context: common.Context, uafRequest: UAFMessage): Promise<void> 检测用户策略的开启状态
processUAFOperation(context: common.Context, uafRequest: UAFMessage, channelBindings?: ChannelBinding): Promise<UAFMessage> 用户UAF操作接口,处理UAF协议消息
notifyUAFResult(context: common.Context, uafResponse: UAFMessage): Promise<void> 开通结果通知接口
[表1FIDO免密身份认证接口功能介绍]

开发步骤

  1. 需要业务方自行根据FIDO标准协议部署FIDO服务器。

  2. 导入相关模块。

    复制代码
    1. import { fido } from '@kit.OnlineAuthenticationKit';
    2. import { BusinessError } from '@ohos.base';
  3. 开通FIDO免密身份认证。

    1. 初始化认证器信息。

      复制代码
      1. // 使用this.uiContext需要获取页面UIAbility的Context,一个页面获取一次即可
      2. **//**方法:uiContext:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
      3. try {
      4. // 调用discover方法初始化认证器信息
      5. let discoverData = await fido.discover(this.uiContext);
      6. } catch (error) {
      7. const err: BusinessError = error as BusinessError;
      8. console.error(`Failed to call discover. Code is ${err.code}, message is ${err.message}`);
      9. // 业务根据错误码判断异常类型,进行相应处理
      10. }
    2. 访问FIDO服务端,获取策略检查报文,检查用户开通状态。

      复制代码
      1. // uafMessage为FIDO服务端获取的策略检查报文
      2. let uafAuthMessage: fido.UAFMessage = {
      3. uafProtocolMessage: uafMessage, // 从服务端获取的检查策略报文
      4. additionalData: "" // 附加信息(可选)
      5. };
      6. let isRegistered: boolean = true;
      7. try {
      8. // 检查是否已经开启FIDO认证
      9. await fido.checkPolicy(this.uiContext, uafAuthMessage);
      10. } catch (error) {
      11. isRegistered = false;
      12. const err: BusinessError = error as BusinessError;
      13. console.error(`Failed to call checkPolicy. Code is ${err.code}, message is ${err.message}`);
      14. // 业务根据错误码判断状态,进行相应处理
      15. }
      16. if (isRegistered) {
      17. console.info("has registered, no need to register again.");
      18. // 已注册,业务根据需要执行后续流程
      19. }
    3. 访问FIDO服务端,获取注册报文,调用processUAFOperation接口进行FIDO注册。

      复制代码
      1. // regMessage为从FIDO服务端获取的注册报文
      2. let uafRegMessage: fido.UAFMessage = {
      3. uafProtocolMessage: regMessage, // 从服务端获取的注册报文
      4. additionalData: "" // 附加信息(可选)
      5. };
      6. // 传连接通道参数(可选)
      7. let channelBinding: fido.ChannelBinding = {};
      8. try {
      9. // 调用processUAFOperation接口进行FIDO注册
      10. let messageResp = await fido.processUAFOperation(this.uiContext, uafRegMessage, channelBinding);
      11. } catch (error) {
      12. const err: BusinessError = error as BusinessError;
      13. console.error(`Failed to call processUAFOperation. Code is ${err.code}, message is ${err.message}`);
      14. // 业务根据错误码判断异常类型,进行相应处理
      15. }
    4. 发送注册响应报文至FIDO服务端进行验证并获取注册结果报文。

      复制代码
      1. // notifyMessage为从FIDO服务端获取的注册结果报文
      2. let notifyMessage:string = "";
      3. let notifyUafMessage: fido.UAFMessage = {
      4. uafProtocolMessage: notifyMessage, // 从服务端获取的注册结果报文
      5. additionalData: "" // 附加信息(可选)
      6. };
    5. 调用notifyUAFResult进行注册结果通知。

      复制代码
      1. try {
      2. // 调用notifyUAFResult进行注册结果通知
      3. fido.notifyUAFResult(this.uiContext, notifyUafMessage).then(notify => {
      4. console.info("Succeeded in doing notifyUAFResult.");
      5. })
      6. } catch (error) {
      7. const err: BusinessError = error as BusinessError;
      8. console.error(`Failed to call notifyUAFResult. Code is ${err.code}, message is ${err.message}`);
      9. // 业务根据错误码判断异常类型,进行相应处理
      10. }
  4. 使用FIDO免密身份认证。

    1. 初始化认证器信息(如果已执行过初始化操作,则无需重复执行)。

      复制代码
      1. // 获取当前界面的context
      2. try {
      3. // 调用discover方法初始化认证器信息
      4. let discoverData = await fido.discover(this.uiContext);
      5. } catch (error) {
      6. const err: BusinessError = error as BusinessError;
      7. console.error(`Failed to call discover. Code is ${err.code}, message is ${err.message}`);
      8. // 业务根据错误码判断异常类型,进行相应处理
      9. }
    2. 访问FIDO服务端,获取策略检查报文,检查用户开启状态。

      复制代码
      1. // uafMessage为从FIDO服务器获取的策略检查报文
      2. let uafAuthMessage: fido.UAFMessage = {
      3. uafProtocolMessage: uafMessage, // 从服务端获取的检查策略报文
      4. additionalData: "" // 附加信息(可选)
      5. };
      6. let isRegistered: boolean = true;
      7. try {
      8. // 检查是否已经开启FIDO认证
      9. await fido.checkPolicy(this.uiContext, uafAuthMessage);
      10. } catch (error) {
      11. isRegistered = false;
      12. const err: BusinessError = error as BusinessError;
      13. console.error(`Failed to call checkPolicy. Code is ${err.code}, message is ${err.message}`);
      14. // 业务根据错误码判断状态,进行相应处理
      15. }
      16. if (isRegistered) {
      17. console.info("has registered, no need to register again.");
      18. // 已注册,业务根据需要执行后续流程
      19. }
    3. 访问FIDO服务端,获取认证报文,调用processUAFOperation接口进行FIDO认证。

      复制代码
      1. // regMessage为从FIDO服务器获取的认证报文
      2. let uafRegMessage: fido.UAFMessage = {
      3. uafProtocolMessage: regMessage, // 从服务端获取的认证报文
      4. additionalData: "" // 附加信息(可选)
      5. };
      6. // 传连接通道参数(可选)
      7. let channelBinding: fido.ChannelBinding = {};
      8. try {
      9. // 调用processUAFOperation接口进行FIDO认证
      10. let messageResp = await fido.processUAFOperation(this.uiContext, uafRegMessage, channelBinding);
      11. } catch (error) {
      12. const err: BusinessError = error as BusinessError;
      13. console.error(`Failed to call processUAFOperation. Code is ${err.code}, message is ${err.message}`);
      14. // 业务根据错误码判断异常类型,进行相应处理
      15. }
      16. //发送认证响应报文至FIDO服务端进行验证并返回认证结果
  5. 关闭FIDO免密身份认证。

    1. 初始化认证器信息(如果已执行过初始化操作,则无需重复执行)。

      复制代码
      1. try {
      2. // 调用discover方法初始化认证器信息
      3. let discoverData = await fido.discover(this.uiContext);
      4. } catch (error) {
      5. const err: BusinessError = error as BusinessError;
      6. console.error(`Failed to call discover. Code is ${err.code}, message is ${err.message}`);
      7. // 业务根据错误码判断异常类型,进行相应处理
      8. }
    2. 访问FIDO服务端,获取注销报文,调用processUAFOperation接口进行FIDO注销。

      复制代码
      1. // deregMessage为从FIDO服务器获取的注销报文
      2. let uafRegMessage: fido.UAFMessage = {
      3. uafProtocolMessage: deregMessage, // 从服务端获取的注销报文
      4. additionalData: "" // 附加信息(可选)
      5. };
      6. // 传连接通道参数(可选)
      7. let channelBinding: fido.ChannelBinding = {};
      8. try {
      9. // 调用processUAFOperation接口进行FIDO注销
      10. let messageResp = await fido.processUAFOperation(this.uiContext, uafRegMessage, channelBinding);
      11. } catch (error) {
      12. const err: BusinessError = error as BusinessError;
      13. console.error(`Failed to call processUAFOperation. Code is ${err.code}, message is ${err.message}`);
      14. // 业务根据错误码判断异常类型,进行相应处理
      15. }
      16. //发送认证响应报文至FIDO服务端进行验证并返回认证结果
相关推荐
蓝枫amy10 小时前
HarmonyOS快速入门
华为·harmonyos
程序猿阿伟15 小时前
《探秘鸿蒙Next:如何保障AI模型轻量化后多设备协同功能一致》
人工智能·华为·harmonyos
GZ_TOGOGO15 小时前
PIM原理与配置
网络·华为·智能路由器
程序猿阿伟15 小时前
《探秘鸿蒙Next:人工智能助力元宇宙高效渲染新征程》
人工智能·华为·harmonyos
GY-9316 小时前
Harmonyos之多目标构建产物实践
harmonyos
Amor风信子16 小时前
华为OD机试真题---战场索敌
java·开发语言·算法·华为od·华为
深海的鲸同学 luvi20 小时前
【HarmonyOS NEXT】华为分享-碰一碰开发分享
华为·harmonyos·碰一碰·华为分享
沅霖1 天前
鸿蒙harmony json转对象(2)
harmonyos
AGI学习社1 天前
2024中国排名前十AI大模型进展、应用案例与发展趋势
linux·服务器·人工智能·华为·llama
kirk_wang2 天前
Flutter调用HarmonyOS NEXT原生相机拍摄&相册选择照片视频
flutter·华为·harmonyos