加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 安全 > 正文

达成Web端指纹登录

发布时间:2022-07-01 15:24:44 所属栏目:安全 来源:互联网
导读:前言 现在越来越多的笔记本电脑内置了指纹识别,用于快速从锁屏进入桌面,一些客户端的软件也支持通过指纹来认证用户身份。 前几天我在想,既然客户端软件能调用指纹设备,web端应该也可以调用,经过一番折腾后,终于实现了这个功能,并应用在了我的开源项目
  前言
 
  现在越来越多的笔记本电脑内置了指纹识别,用于快速从锁屏进入桌面,一些客户端的软件也支持通过指纹来认证用户身份。
 
  前几天我在想,既然客户端软件能调用指纹设备,web端应该也可以调用,经过一番折腾后,终于实现了这个功能,并应用在了我的开源项目中。
     
  最终的实现效果视频如下所示:
 
  web端指纹登录的实现
 
  注册指纹
 
  首先,我们需要拿到服务端返回的用户凭证,随后将用户凭证传给指纹设备,调起系统的指纹认证,认证通过后,回调函数会返回设备id与客户端信息,我们需要将这些信息保存在服务端,用于后面调用指纹设备来验证用户身份,从而实现登录。
 
  接下来,我们总结下注册指纹的过程,如下所示:
 
  用户使用其他方式在网站登录成功后,服务端返回用户凭证,将用户凭证保存到本地
 
  检测客户端是否存在指纹设备
 
   
  注意:注册指纹只能工作在使用 https 连接,或是使用 localhost的网站中。
 
  指纹认证
 
   
  接下来,我们总结下指纹认证的过程,如下所示:
 
  从本地获取用户凭证与设备id
  检测客户端是否存在指纹设备
  如果存在,将用户凭证与设备id传给指纹认证函数进行校验
  身份认证成功,调用登录接口获取用户信息
  注意:指纹认证只能工作在使用 https 连接,或是使用 localhost的网站中。
 
  实现过程
 
  上一个章节,我们捋清了指纹登录的具体实现思路,接下来我们来看下具体的实现过程与代码。
 
  服务端实现
 
  首先,我们需要在服务端写3个接口:获取TouchID、注册TouchID、指纹登录
 
  获取TouchID
 
  这个接口用于判断登录用户是否已经在本网站注册了指纹,如果已经注册则返回TouchID到客户端,方便用户下次登录。
 
  controller层代码如下
  复制
  @ApiOperation(value = "获取TouchID", notes = "通过用户id获取指纹登录所需凭据")
      @CrossOrigin()
      @RequestMapping(value = "/getTouchID", method = RequestMethod.POST)
      public ResultVO<?> getTouchID(@ApiParam(name = "传入userId", required = true) @Valid @RequestBody GetTouchIdDto touchIdDto, @RequestHeader(value = "token") String token) {
          JSONObject result = userService.getTouchID(JwtUtil.getUserId(token));
           if (touchId != null) {
             // touchId存在
              returnResult.put("code", ResultEnum.GET_TOUCHID_SUCCESS);
              returnResult.put("touchId", touchId);
              return returnResult;
          }
          // touchId不存在
          returnResult.put("code", ResultEnum.GET_TOUCHID_ERR);
          return returnResult;
      }
  1.
   注册TouchID
 
  这个接口用于接收客户端指纹设备返回的TouchID与客户端信息,将获取到的信息保存到数据库的指定用户。
 
  controller层代码如下
  复制
  @ApiOperation(value = "注册TouchID", notes = "保存客户端返回的touchid等信息")
      @CrossOrigin()
      @RequestMapping(value = "/registeredTouchID", method = RequestMethod.POST)
      public ResultVO<?> registeredTouchID(@ApiParam(name = "传入userId", required = true) @Valid @RequestBody SetTouchIdDto touchIdDto, @RequestHeader(value = "token") String token) {
          JSONObject result = userService.registeredTouchID(touchIdDto.getTouchId(), touchIdDto.getClientDataJson(), JwtUtil.getUserId(token));
          if (result.getEnum(ResultEnum.class, "code").getCode() == 0) {
              // touchId获取成功
              return ResultVOUtil.success(result.getString("data"));
          }
          // 返回错误信息
          return ResultVOUtil.error(result.getEnum(ResultEnum.class, "code").getCode(), result.getEnum(ResultEnum.class, "code").getMessage());
      }
   接口具体实现代码如下
  复制
  // 注册TouchID
      @Override
      public JSONObject registeredTouchID(String touchId, String clientDataJson, String userId) {
          JSONObject result = new JSONObject();
          User row = new User();
          row.setTouchId(touchId);
          row.setClientDataJson(clientDataJson);
          row.setUserId(userId);
         // 根据userId更新touchId与客户端信息
          int updateResult = userMapper.updateTouchId(row);
          if (updateResult>0) {
              result.put("code", ResultEnum.SET_TOUCHED_SUCCESS);
              result.put("data", "touch_id设置成功");
              return result;
          }
          result.put("code", ResultEnum.SET_TOUCHED_ERR);
          return result;
      }
   指纹登录
 
  这个接口接收客户端发送的用户凭证与touchId,随后将其和数据库中的数据进行校验,返回用户信息。
 
  controller层代码如下
  复制
  @ApiOperation(value = "指纹登录", notes = "通过touchId与用户凭证登录系统")
      @CrossOrigin()
      @RequestMapping(value = "/touchIdLogin", method = RequestMethod.POST)
      public ResultVO<?> touchIdLogin(@ApiParam(name = "传入Touch ID与用户凭证", required = true) @Valid @RequestBody TouchIDLoginDto touchIDLogin) {
          JSONObject result = userService.touchIdLogin(touchIDLogin.getTouchId(), touchIDLogin.getCertificate());
          return LoginUtil.getLoginResult(result);
      }
  1.
  2.
  3.
  4.
  5.
  6.
  7.
  接口具体实现代码如下
  复制
  // 指纹登录
      @Override
      public JSONObject touchIdLogin(String touchId, String certificate) {
          JSONObject returnResult = new JSONObject();
          User row = new User();
          row.setTouchId(touchId);
          row.setUuid(certificate);
          User user = userMapper.selectUserForTouchId(row);
          String userName = user.getUserName();
          String userId = user.getUserId();
          // 用户名为null则返回错误信息
          if (userName == null) {
              // 指纹认证失败
              returnResult.put("code", ResultEnum.TOUCHID_LOGIN_ERR);
              return returnResult;
          }
         // 指纹认证成功,返回用户信息至客户端
         // ... 此处代码省略,根据自己的需要返回用户信息即可 ...//
         returnResult.put("code", ResultEnum.LOGIN_SUCCESS);
         return returnResult;
      } 

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读