手表就在手腕上,为什么还要再掏手机输密码?这就是伴随设备认证要解决的问题。

文章封面

做支付确认功能的时候,最开始的思路很简单:付钱之前,弹一个指纹或者人脸验证。验证过了就放行。

直到产品提了需求:用户戴着手表的时候,能不能不用再掏手机验证?手表就在手上,点一下手表就能确认。

这时候才意识到,身份认证不是只有"指纹/人脸"这一种。系统还有一套伴随设备认证机制——当用户佩戴着可信的伴随设备(手表、手环)的时候,可以用这个设备来做二次确认,不用再掏手机。

一、伴随设备认证到底是什么

先把概念理清楚:

认证方式验证对象
指纹/人脸用户本人
设备锁屏密码用户本人
伴随设备认证你是不是带着可信设备的本人

伴随设备认证的逻辑是:你手机上已经解锁了,手腕上还戴着绑定过的手表,系统就知道"是你本人在操作手机"。这时候做一些敏感操作的二次确认,不用再掏手机验证一遍,点一下手表就行。

它不是替代指纹人脸,是补充。低风险的操作,伴随设备就够了;高风险的操作,还是要指纹人脸。

二、认证实例和认证类型

使用 User Authentication Kit 的时候,要先创建认证实例,然后指定认证类型和可信等级。

这段代码解决什么问题: 发起伴随设备认证。
文件: auth/PaymentAuth.ets
用途: 支付二次确认
接入位置: 支付按钮点击后

import userAuth from '@ohos.userIAM.userAuth';

async confirmPayment() {
  const userAuthInstance = userAuth.getUserAuthInstance();
  
  const param: userAuth.AuthParam = {
    challenge: 'xxx',
    authTrustLevel: userAuth.AuthTrustLevel.ATL1,
    authTypes: [userAuth.UserAuthType.COMPANION_DEVICE]
  };

  const result = await userAuthInstance.auth(param);
  if (result.result === userAuth.UserAuthResult.SUCCESS) {
    // 认证通过,继续支付
  }
}

这里 authTypes 指定了用伴随设备认证。可信等级 ATL1 是比较基础的等级,高风险操作要更高等级。

三、可信等级为什么要区分

不是所有业务都用同一个认证强度。

可信等级典型场景
基础等级查看个人信息
中等等级修改设置
高等级支付、转账、修改密码

伴随设备认证适合中低风险的二次确认。如果是大额支付这种高风险操作,还是要指纹或者人脸。不能所有业务都用同一个认证结果。

四、认证成功不是永久登录

这是最容易踩的坑。很多人觉得:认证通过了,那这个用户就是可信的了,后面所有操作都不用再验证了。

不对。认证结果是有有效期的,而且是和具体业务场景绑定的。

错误做法风险
认证一次,永久放行手机放桌上,别人拿起来随便操作
所有业务共用同一个认证结果低风险认证结果被用到高风险业务
认证成功后不设超时放了半小时,还认为是刚认证的本人

正确的做法是:每个敏感操作都要单独走认证流程,或者设置合理的有效期。不能一次认证,永久放行。

五、伴随设备断开了怎么办

还有个场景:用户戴着手表认证完了,然后把手表摘了,放一边了。这时候认证状态要不要保留?

不能保留。伴随设备认证的前提是"设备还在身边"。设备都摘了,就不能再认为还是伴随设备认证的可信状态了。

系统会监听伴随设备的连接状态。设备断开了,之前的伴随认证结果就失效了。你不能自己缓存一个"已认证"的状态一直用。

系统架构图

六、几个容易踩的坑

第一个坑:把认证成功当成永久登录。认证是有有效期的,而且是和具体操作绑定的。

第二个坑:所有业务共用同一个认证结果。低风险的认证不能直接给高风险业务用。

第三个坑:认证失败直接退出业务。失败了应该让用户重试,或者换其他认证方式,不要直接把页面关了。

第四个坑:不区分认证等级。查看个设置也要弹指纹,用户体验很差。

第五个坑:重复高频拉起认证。用户点一下就弹一次,太频繁了。要做合理的节流。

运行效果图

这次做支付确认最大的体会是:身份认证不是一个"过了就完事"的开关,是一套分级、分场景、有有效期的安全机制。伴随设备认证只是其中一种方式,适合中低风险的无感确认。用对了能提升体验,用错了就是安全漏洞。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐