业务: 前后端实现二维码扫码登录-深度剖析

简介

还是老样子,先把产品的需求设计给理一理先。如果没有做过这一块的前端小伙伴,可能一脸懵逼。没事,我也一样,万事开头都不简单,所以需要我们花点时间精力梳理一下

需求:

  1. 登录二维码有效期默认2分钟,超过2分钟提示用户刷新
  2. 扫码成功后,跳转扫码成功页面,用户在移动端点击确认登录后,登录进入应用

理解

  1. 登录二维码有效期默认2分钟,超过2分钟提示用户刷新: 在生成登录二维码时,后端服务器将生成一个二维码标识符,并设置一个2分钟的有效期。后端可以通过生成时间戳或其他方法来跟踪二维码的有效性。前端在展示二维码的同时也开始计时,在二维码有效期结束前,如果用户未完成扫码登录,可以提示用户刷新二维码来获取一个新的二维码和标识符。
  2. 扫码成功后,跳转扫码成功页面,用户在移动端点击确认登录后,登录进入应用: 一旦用户在移动设备上成功扫描二维码,并点击确认登录按钮,前端应轮询向后端发送请求,确认用户的登录操作。

梳理

通过上面简介中的初步分析,可以大致画一下下面的流程图,这样方便我们一步步去实现

流程图

graph TD A[生成二维码] --> B[展示二维码] B --> C((等待用户扫码
开始轮询)) C -- 用户扫码成功 --> D[跳转扫码成功页面] D --> E((用户在移动端
点击确认登录)) E -- 确认登录 --> F[验证登录信息] F -- 验证成功 --> G[用户登录成功] G --> H[进入应用程序] H --> I[应用程序主页] F -- 验证失败 --> J[显示登录失败提示] C -- 用户扫码失败或超时 --> K((二维码
是否过期)) K -- 是 --> L[提示用户刷新二维码] L --> C K -- 否 --> C

接口设计

根据上面分析出来的流程图,我们了解到

登录二维码有效期默认2分钟,超过2分钟提示用户刷新

在生成登录二维码时,后端服务器将生成一个二维码标识符,并设置一个2分钟的有效期。后端可以通过生成时间戳或其他方法来跟踪二维码的有效性,与此同时,在前端展示出二维码图之后,前端就需要进行轮询监听调后端的接口,而后端也是通过该接口来反馈给前端是否有人扫码成功、或者失败、或者过期

后端接口设计需要将这几个状态标记出来,比如

reason: QRCODE_SUCCESS、QRCODE_ERROR、QRCODE_EXPIRE;

前端通过轮询的接口接收到这些不同状态做不同的处理逻辑即可

那么后端需要设计的就以下这几个接口:

1. 二维码生成

如果有不同端扫描的需求,可以加上一个platform平台参数,如下

接口命名

POST: /v1/accounts/qrcode/

获取二维码

platform:

RINGKOL_PC // xxpc端

RINGKOL_WEB // xxweb端

RINGKOL_WEB_MANAGER // xx管理端

RINGKOL_WEB_OPERATE // xx后台

RINGKOL_WEB_ORGANIZE // xx后台

body参数:

ts 复制代码
export interface Request {
    /**
     * 重新生成/取消时需要给
     */
    code?: string;
    platform: string;
}

响应结构:

ts 复制代码
export interface Response {
    /**
     * 二维码,前缀+base64串,格式:rk://scanforpclogin/{qrcode}
     * 二维码json解析结构
     * {
     * "id":"",
     * "expire":1685696389,
     * "prefix":"rk://scanforpclogin/"
     * "platform":"Rxx_PC"
     * }
     */
    png: string;
}

2. 扫描二维码

主要给移动端用来扫码调的, 移动端先扫码web端的二维码图片,解析得到id,然后将id作为参数传进该扫描二维码接口

接口命名

POST: /v1/accounts/qrcode_fill

body参

可以省略,用户信息是放在header的token中的

响应结构

ts 复制代码
export interface Response {
    /**
     * 身份卡ID,为空就不限制
     */
    card_id: string;
    /**
     * 二维码令牌,二维码解析结果
     */
    id: string;
    /**
     * 状态,SCAN 已扫描
     * VERIFY 已确认
     * CANCEL 取消
     */
    step: string;
}

3. 账号登陆

web端通过轮询该接口,监听移动端的扫码状态,如扫描二维码的三个状态:

  • SCAN 已扫描
  • VERIFY 已确认
  • CANCEL 取消

然后就是另外的三个状态:QRCODE_SUCCESS、QRCODE_ERROR、QRCODE_EXPIRE 通过这些状态,基本都能实现市面上的关于二维码的扫码业务逻辑了;

接口命名

POST /v1/passport/guest

body参数

响应结构

前端实现

这里主要解说上面所提的环节以及接口返回的格式做一下简略的处理总结

1. 二维码生成接口返回

将图中的png结果,按照接口文档拼接成base64格式后,通过qrcode-parser解析数据

import qrcodeParser from 'qrcode-parser';

ts 复制代码
    V1CreateQRcode().then((res) => {
        qrcodeUrl.value = `data:image/png;base64,${res.data?.png}`;
        qrcodeParser(res.data?.png)
            .then((result: any) => {
                console.log(JSON.parse(result));
                QrCodeData.value = result ? JSON.parse(result) : null;
                // setUseAsyncHookInit();
                console.log(flush);
                // flush();
                recover();
                // qrcodeUrl.value = JSON.stringify(res.data?.png);
            })
            .catch((err) => {
                console.log(err);
            });
    });
 

解析后即可得到如下结果:

  1. 接口轮询Hook的封装 调轮询的hook接口实现监听和逻辑处理,而关于hook的实现,将在下一篇文章详细介绍

总结

登录二维码有效期默认2分钟,超过2分钟提示用户刷新: 在生成登录二维码时,后端服务器将生成一个二维码标识符,并设置一个2分钟的有效期,即生成二维码中解析的数据

js 复制代码
{
    "id": "", // 生成二维码的标识符,这个要传给账号登录的code参数
    "expire": 1685696389, // 有效时间,就是生成该二维码的时间,
    "prefix": "[rk://scanforpclogin/]()",
    "platform": "Rxx_PC"
}

后端通过生成时间戳来expire,跟踪二维码的有效性,当然也可以通过其他方法实现。

前端在展示二维码后,开始轮询调账号登录接口

将二维码标识传到code字段中,在二维码有效期结束前,如果用户未完成扫码登录,可以提示用户刷新二维码来获取一个新的二维码和标识符。 如下:

关于其他的错误成功等状态,就根据自己的业务需求进行操作,比如扫码成功后,跳转扫码成功页面,用户在移动端点击确认登录后,登录进入应用: 一旦用户在移动设备上成功扫描二维码,并点击确认登录按钮,前端应立即向后端发送请求,确认用户的登录操作

后端服务器检查接收到的请求中的标识符是否与之前生成的相匹配,并验证标识符的有效性和状态。如果匹配和验证成功,则表示用户已经完成了登录操作。后端服务器可以更新用户的登录状态,并将用户重定向到进入应用程序的页面。

相关推荐
kyriewen10 小时前
百度用6%成本碾压硅谷?中国AI把性价比玩明白了
前端·百度·ai编程
kyriewen11 小时前
你还在手动敲命令部署?GitHub Actions 让你 push 即上线,摸鱼时间翻倍
前端·面试·github
Csvn12 小时前
Pinia 状态管理
前端
不减20斤不改头像13 小时前
手机一句话开发贪吃蛇!TRAE SOLO 移动端 AI 编程实测
前端·后端
xuankuxiaoyao13 小时前
Vue.js实践-组件基础下
前端·javascript·vue.js
小白学大数据13 小时前
JS 混淆加密下的 Python 爬虫解决方案
javascript·爬虫·python
一棵白菜13 小时前
Claude Code + Amazon Bedrock 使用指南
前端
大家的林语冰14 小时前
前端周刊:axios 疑遭朝鲜黑客“钓鱼“;CSS 新函数上线;npm 上线深色主题;Oxlint 兼容表;ESLint 支持 Temporal......
前端·javascript·css
哀木15 小时前
一个简单的套壳方案,就能让你的 Agent 少做重复初始化
前端
问心无愧051315 小时前
ctf show web入门27
前端