实现Web端指纹登录(下)

简介: 实现Web端指纹登录(下)

指纹登录


这个函数接收2个参数:用户凭证、设备id,我们会通过这两个参数来调起客户端的指纹设备来验证身份,具体的实现代码如下:


touchIDLogin: async function(certificate: string, touchId: string) {
      // 校验设备是否支持touchID
      const hasTouchID = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
      if (hasTouchID) {
        // 更新登录凭证
        this.touchIDLoginOptions.publicKey.challenge = this.base64ToArrayBuffer(
          certificate
        );
        // 更新touchID
        this.touchIDLoginOptions.publicKey.allowCredentials[0].id = this.base64ToArrayBuffer(
          touchId
        );
        // 开始校验指纹
        await navigator.credentials.get(this.touchIDLoginOptions);
        // 调用指纹登录接口
        this.$api.touchIdLogingAPI
          .touchIdLogin({
            touchId: touchId,
            certificate: certificate
          })
          .then((res: responseDataType) => {
            if (res.code == 0) {
              // 存储当前用户信息
              localStorage.setItem("token", res.data.token);
              localStorage.setItem("refreshToken", res.data.refreshToken);
              localStorage.setItem("profilePicture", res.data.avatarSrc);
              localStorage.setItem("userID", res.data.userID);
              localStorage.setItem("username", res.data.username);
              const certificate = res.data.certificate;
              localStorage.setItem("certificate", certificate);
              // 跳转消息组件
              this.$router.push({
                name: "message"
              });
              return;
            }
            // 切回登录界面
            this.isLoginStatus = loginStatusEnum.NOT_LOGGED_IN;
            alert(res.msg);
          });
      }
    }


注意⚠️:注册新的指纹后,旧的Touch id就会失效,只能通过新的Touch ID来登录,否则系统无法调起指纹设备,会报错:认证出了点问题。


整合现有登录逻辑


完成上述步骤后,我们已经实现了整个指纹的注册、登录的逻辑,接下来我们来看看如何将其与现有登录进行整合。


调用指纹注册


当用户使用用户名、密码或者第三方平台授权登录成功后,我们就调用指纹注册函数,提示用户是否对本网站进行授权,实现代码如下:


authLogin: function(state: string, code: string, platform: string) {
      this.$api.authLoginAPI
        .authorizeLogin({
          state: state,
          code: code,
          platform: platform
        })
        .then(async (res: responseDataType) => {
          if (res.code == 0) {
            //  ... 授权登录成功,其他代码省略 ... //
            // 保存用户凭证,用于指纹登录
            const certificate = res.data.certificate;
            localStorage.setItem("certificate", certificate);
            // 校验设备是否支持touchID
            const hasTouchID = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
            if (hasTouchID) {
              //  ... 其他代码省略 ... //
              // 获取Touch ID,检测用户是否已授权本网站指纹登录
              this.$api.touchIdLogingAPI
                .getTouchID({
                  userId: userId
                })
                .then(async (res: responseDataType) => {
                  if (res.code !== 0) {
                    // touchId不存在, 询问用户是否注册touchId
                    await this.touchIDRegistered(username, userId, certificate);
                  }
                  // 保存touchid
                  localStorage.setItem("touchId", res.data);
                  // 跳转消息组件
                  await this.$router.push({
                    name: "message"
                  });
                });
              return;
            }
            // 设备不支持touchID,直接跳转消息组件
            await this.$router.push({
              name: "message"
            });
            return;
          }
          // 登录失败,切回登录界面
          this.isLoginStatus = loginStatusEnum.NOT_LOGGED_IN;
          alert(res.msg);
        });
    }


最终的效果如下所示:

640.png

640.png

每次第三方平台授权登录时都会检测当前用户是否已授权本网站,如果已授权则将Touch ID保存至本地,用于通过指纹直接登录。


调用指纹登录


当登录页面加载完毕1s后,我们从用户本地取出用户凭证与Touch ID,如果存在则提示用户是否需要通过指纹来登录系统,具体代码如下所示:


mounted() {
    const touchId = localStorage.getItem("touchId");
    const certificate = localStorage.getItem("certificate");
    // 如果touchId存在,则调用指纹登录
    if (touchId && certificate) {
      // 提示用户是否需要touchId登录
      setTimeout(() => {
        if (window.confirm("您已授权本网站通过指纹登录,是否立即登录?")) {
          this.touchIDLogin(certificate, touchId);
        }
      }, 1000);
    }
  }


最终效果如下所示:

640.png

640.png

项目地址


本文代码的完整地址请移步:Login.vue

  • 在线体验地址:chat-system
  • 项目GitHub地址:chat-system-github


写在最后


最近打算换工作,有没有广州这边的公司可以内推我呀😁,我的微信:Baymax-kt


  • 公众号无法外链,如果文中有链接,可点击下方阅读原文查看😊


相关文章
|
8月前
|
存储 数据库 数据安全/隐私保护
实现一个简单的Web应用,要求可以进行用户注册和登录。
实现一个简单的Web应用,要求可以进行用户注册和登录。
87 3
|
7月前
|
网络协议 小程序 生物认证
Web应用&企业产权&指纹识别&域名资产&网络空间&威胁情报
Web应用&企业产权&指纹识别&域名资产&网络空间&威胁情报
|
3月前
|
开发框架 网络协议 Java
web搜集-指纹识别 课程笔记
web搜集-指纹识别 课程笔记
|
5月前
|
前端开发
炫酷登录页大变身:5分钟带你入门Web动效设计
炫酷登录页大变身:5分钟带你入门Web动效设计
|
5月前
|
开发者 Java Spring
JSF 牵手社交登录,如魔法风暴席卷 Web 世界,开启震撼便捷登录之旅!
【8月更文挑战第31天】在互联网时代,便捷登录成为用户的核心需求。社交登录凭借其便捷性、安全性和社交化的特点,在各类Web应用中广泛应用。JavaServer Faces(JSF),作为一款流行的Java Web框架,能够轻松集成社交登录功能,显著提升用户体验。本文详细介绍社交登录的优势,并提供两种JSF集成社交登录的常见方法:一是利用Spring Social等第三方库简化开发;二是自行实现社交登录流程。开发者可根据项目需求选择适合的方案。
53 0
|
7月前
|
存储 前端开发 搜索推荐
Web前端网站(一) - 登录页面及账号密码验证
页面背景动态是烟花和文字特效与缓缓下落的雪花相结合,在登录表单的旁边还有五个白色光圈以不规则的方式环绕,当鼠标靠近时,会发出彩色的光芒~~~
111 1
Web前端网站(一) - 登录页面及账号密码验证
|
7月前
|
安全 前端开发 Java
Java Web项目登录报Session Error
Java Web项目登录报Session Error
56 0
|
7月前
|
中间件 Java 生物认证
Web应用&源码泄漏&开源闭源&指纹识别&GIT&SVN&DS&备份
Web应用&源码泄漏&开源闭源&指纹识别&GIT&SVN&DS&备份
|
7月前
|
XML Java 应用服务中间件
在Web Application中集成CAS登录模块
在Web Application中集成CAS登录模块
48 0
|
8月前
|
存储 中间件 数据安全/隐私保护
Django教程第3章 | Web开发实战-登录
登录案例、Djiango中间件【2月更文挑战第23天】
139 2
Django教程第3章 | Web开发实战-登录