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

打印 上一主题 下一主题

主题 818|帖子 818|积分 2464

场景介绍



  • 开通FIDO免密身份认证功能,使用用户已有的生物特性开通FIDO免密身份认证能力。
  • 使用FIDO免密身份认证功能,使用用户已开通的生物特性举行FIDO免密身份认证。
  • 关闭FIDO免密身份认证功能,使用用户已开通的生物特性注销FIDO免密身份认证能力。
基本概念

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


  • FIDO协议 FIDO(Fast Identity Online)是一套身份认证框架协议,它由FIDO联盟推出并持续维护。FIDO规范定义了一套在线身份认证的技能架构。
  • UAF身份认证框架 UAF(Universal Authentication Framework)意为通用身份认证框架,目的是通过生物识别(如指纹识别)和加密技能方式,为用户提供无暗码的身份认证体验。
束缚与限制

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


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

业务举行FIDO免密身份认证功能的开通、使用和关闭。
表1 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>
  开通效果关照接口
  开辟步调


  • 需要业务方自行根据FIDO标准协议部署FIDO服务器。
  • 导入相关模块。
    1. [/code][list=1]
    2. [*]import { fido } from '@kit.OnlineAuthenticationKit';
    3. [*]import { BusinessError } from '@ohos.base';
    4. [/list]
    5. [*]开通FIDO免密身份认证。[list=1]
    6. [*]初始化认证器信息。 [code]
    复制代码

    • // 使用this.uiContext需要获取页面UIAbility的Context,一个页面获取一次即可
    • // 方法:uiContext:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    • try {
    • // 调用discover方法初始化认证器信息
    • let discoverData = await fido.discover(this.uiContext);
    • } catch (error) {
    • const err: BusinessError = error as BusinessError;
    • console.error(`Failed to call discover. Code is ${err.code}, message is ${err.message}`);
    • // 业务根据错误码判断异常类型,举行相应处理
    • }

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

    • // regMessage为从FIDO服务端获取的注册报文
    • let uafRegMessage: fido.UAFMessage = {
    • uafProtocolMessage: regMessage, // 从服务端获取的注册报文
    • additionalData: "" // 附加信息(可选)
    • };
    • // 传连接通道参数(可选)
    • let channelBinding: fido.ChannelBinding = {};
    • try {
    • // 调用processUAFOperation接口举行FIDO注册
    • let messageResp = await fido.processUAFOperation(this.uiContext, uafRegMessage, channelBinding);
    • } catch (error) {
    • const err: BusinessError = error as BusinessError;
    • console.error(`Failed to call processUAFOperation. Code is ${err.code}, message is ${err.message}`);
    • // 业务根据错误码判断异常类型,举行相应处理
    • }

  • 发送注册响应报文至FIDO服务端举行验证并获取注册效果报文。
    1. [/code][list=1]
    2. [*]// notifyMessage为从FIDO服务端获取的注册效果报文
    3. [*]let notifyMessage:string = "";
    4. [*]let notifyUafMessage: fido.UAFMessage = {
    5. [*]uafProtocolMessage: notifyMessage, // 从服务端获取的注册效果报文
    6. [*]additionalData: "" // 附加信息(可选)
    7. [*]};
    8. [/list]
    9. [*]调用notifyUAFResult举行注册效果关照。 [code]
    复制代码

    • try {
    • // 调用notifyUAFResult举行注册效果关照
    • fido.notifyUAFResult(this.uiContext, notifyUafMessage).then(notify => {
    • console.info("Succeeded in doing notifyUAFResult.");
    • })
    • } catch (error) {
    • const err: BusinessError = error as BusinessError;
    • console.error(`Failed to call notifyUAFResult. Code is ${err.code}, message is ${err.message}`);
    • // 业务根据错误码判断异常类型,举行相应处理
    • }


  • 使用FIDO免密身份认证。

    • 初始化认证器信息(如果已执行过初始化操作,则无需重复执行)。
      1. [/code][list=1]
      2. [*]// 获取当前界面的context
      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. [*]}
      11. [/list]
      12. [*]访问FIDO服务端,获取战略检查报文,检查用户开启状态。 [code]
      复制代码

      • // uafMessage为从FIDO服务器获取的战略检查报文
      • let uafAuthMessage: fido.UAFMessage = {
      • uafProtocolMessage: uafMessage, // 从服务端获取的检查战略报文
      • additionalData: "" // 附加信息(可选)
      • };
      • let isRegistered: boolean = true;
      • try {
      • // 检查是否已经开启FIDO认证
      • await fido.checkPolicy(this.uiContext, uafAuthMessage);
      • } catch (error) {
      • isRegistered = false;
      • const err: BusinessError = error as BusinessError;
      • console.error(`Failed to call checkPolicy. Code is ${err.code}, message is ${err.message}`);
      • // 业务根据错误码判断状态,举行相应处理
      • }
      • if (isRegistered) {
      • console.info("has registered, no need to register again.");
      • // 已注册,业务根据需要执行后续流程
      • }

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

      • try {
      • // 调用discover方法初始化认证器信息
      • let discoverData = await fido.discover(this.uiContext);
      • } catch (error) {
      • const err: BusinessError = error as BusinessError;
      • console.error(`Failed to call discover. Code is ${err.code}, message is ${err.message}`);
      • // 业务根据错误码判断异常类型,举行相应处理
      • }

    • 访问FIDO服务端,获取注销报文,调用processUAFOperation接口举行FIDO注销。 [code][/code]

      • // deregMessage为从FIDO服务器获取的注销报文
      • let uafRegMessage: fido.UAFMessage = {
      • uafProtocolMessage: deregMessage, // 从服务端获取的注销报文
      • additionalData: "" // 附加信息(可选)
      • };
      • // 传连接通道参数(可选)
      • let channelBinding: fido.ChannelBinding = {};
      • try {
      • // 调用processUAFOperation接口举行FIDO注销
      • let messageResp = await fido.processUAFOperation(this.uiContext, uafRegMessage, channelBinding);
      • } catch (error) {
      • const err: BusinessError = error as BusinessError;
      • console.error(`Failed to call processUAFOperation. Code is ${err.code}, message is ${err.message}`);
      • // 业务根据错误码判断异常类型,举行相应处理
      • }
      • //发送认证响应报文至FIDO服务端举行验证并返回认证效果



    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
  • 回复

    使用道具 举报

    0 个回复

    倒序浏览

    快速回复

    您需要登录后才可以回帖 登录 or 立即注册

    本版积分规则

    泉缘泉

    金牌会员
    这个人很懒什么都没写!

    标签云

    快速回复 返回顶部 返回列表