web扫码登录

news2024/11/25 14:45:26

文章目录

  • 需求
  • 流程
    • 交互流程
    • 服务交互流程
  • 关键思路
  • 代码
    • 生成二维码,返回给PC展示
    • 轮询查询二维码状态
    • APP扫码请求
    • 登录
  • 总结

需求

pc端实现app扫码登录

流程

交互流程

在这里插入图片描述

服务交互流程

在这里插入图片描述

关键思路

主要问题在于如何识别APP端用户,然后传递给PC端已经登录成功

通过记录标记扫描唯一二维码与用户进行关联,在PC端查询时已绑定通过返回的绑定数据进行登录。这里查询可以使用轮询/长连接,返回绑定的数据主要用于请求返回登录后需要的信息

代码

生成二维码,返回给PC展示

注意返回二维码唯一标识可以进行加码,防止不必要的安全问题

    /**
     * pc 获取二维码
     *
     * @return
     * @throws IOException
     */
    @Override
    public ScanningCodeDto getLoginScanningCode() throws IOException {
       //两个字段key二维码标识,code 二维码
        ScanningCodeDto codeDto = new ScanningCodeDto();
        String primitiveKey = StrKit.uuid();
        //hutool包构建aes加密
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, ScanningCodeLoginConstant.CODE_SECRET_KEY.getBytes(StandardCharsets.UTF_8));
        //加密为16进制表示
        String key = aes.encryptHex(primitiveKey);
        codeDto.setKey(key);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //二维码内容也为加密内容
        QrCodeUtil.generate(key, 300, 300, null, baos);
        // 进行Base64编码
        String code = Base64.encode(baos.toByteArray());
        baos.flush();
        codeDto.setCode(code);
        //redis存储信息,5分钟过期
        ScanningCodeInfoVo scanningCodeInfoVo = new ScanningCodeInfoVo();
        scanningCodeInfoVo.setKey(key);
        scanningCodeInfoVo.setCode(code);
        scanningCodeInfoVo.setStatus("1");
        //设置到redis,key和过期时间可以根据自己情况设置
        redisUtils.set( primitiveKey, scanningCodeInfoVo, 60 * 5);
        return codeDto;
    }

二维码包含信息能识别即可,可以是url也可以是标识。返回二维码时同时返回唯一标识来标记查询时是哪个二维码

轮询查询二维码状态

 /**
     * 查询二维码状态
     *
     * @param key 二维码唯一标识
     * @return
     */
 @Override
    public ScanningCodeStatusDto getScanningCodeStatus(String key) {
        //解密为字符串
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, ScanningCodeLoginConstant.CODE_SECRET_KEY.getBytes(StandardCharsets.UTF_8));
        String primitiveKey = aes.decryptStr(key, CharsetUtil.CHARSET_UTF_8);
        //查询redis二维码信息
        ScanningCodeInfoVo scanningCodeInfoVo = (ScanningCodeInfoVo) redisUtils.get(primitiveKey);
        if (Objects.isNull(scanningCodeInfoVo)) {
            //返回已过期
            throw  new Exception("二维码已过期");
        }
        //成功后登录
        String status = scanningCodeInfoVo.getStatus();
        ScanningCodeStatusDto codeStatusDto = new ScanningCodeStatusDto();
        //已扫描
        if (Objects.equals("2", status)) {
            //构建aes加密,加密用户id为16进制表示
            codeStatusDto.setKey(aes.encryptHex(scanningCodeInfoVo.getUserId() + ":" + scanningCodeInfoVo.getUserName()));
            codeStatusDto.setStatus("2");
            return codeStatusDto;
        }
        codeStatusDto.setStatus("1");
        return codeStatusDto;
    }

有些系统使用长连接,也可以。 注意这里可以加个锁,避免多台设备扫描到一个码。

APP扫码请求

 /**
     * 扫描二维码
     *
     * @param dto
     * @return
     */
    @Override
    public String scan(ScanningCodeDto dto) {
        //获取对应二维码信息
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, ScanningCodeLoginConstant.CODE_SECRET_KEY.getBytes(StandardCharsets.UTF_8));
        String primitiveKey = aes.decryptStr(dto.getKey(), CharsetUtil.CHARSET_UTF_8);
        //查询redis二维码信息
        ScanningCodeInfoVo scanningCodeInfoVo = (ScanningCodeInfoVo) redisUtils.get(primitiveKey);
        if (Objects.isNull(scanningCodeInfoVo)) {
            //返回已过期
            throw new Exception("二维码已过期");
        }
        //成功后登录
        String status = scanningCodeInfoVo.getStatus();
        if (Objects.equals("2", status)) {
            //二维码已经使用
            throw new Exception("二维码已经使用");
        }
        //标记二维码信息,标记状态已经使用
        scanningCodeInfoVo.setStatus("2");
        scanningCodeInfoVo.setUserId(teasUserSession.getUserId());
        scanningCodeInfoVo.setUserName(teasUserSession.getUserName());
        //修改redis中二维码信息
        redisUtils.set(primitiveKey, scanningCodeInfoVo, 60 * 5);
        //返回二维码情况
        return ”登陆成功“;
    }

登录

轮询查询到已经扫描并且获取到用户信息后,几个方案都可以

  1. 调用特定的登录接口进行登录,通过返回的key包含的加密信息进行登录(我这里的使用)
  2. 轮询接口查询到已经扫码,获取用户信息直接后台登录
  3. 返回加密后的账号密码调用原有的登录接口(和第一种差不多)

根据自己的情况进行处理即可

总结

扫码登录流程大差不差,主要解决的问题

  1. 谁扫了码,如何去识别用户扫码
  2. pc如何获取用户信息并达成登录

有问题欢迎一起探讨个人信息联系我.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序瀑布流实现

什么是瀑布流布局 瀑布流布局,一般等宽,不等高的列表排列 原理是找出高度之和最小的那一列,在高度最小列继续添加元素 可以通过 absolute 定位实现,动态计算每一项的 top 和 left 封装瀑布流方法 function getAllRect(context…

HTML期末作业课程设计期末大作业--小米网站开发者平台首页 1页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制| HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#x…

MyBatis学习笔记(2022-11-30)

熬过无人问津的日子才会有诗和远方。 文章目录一、MyBatis简述二、快速入门三、MyBatis配置文件详解1. MyBatis核心配置文件1.1 configuration(配置)1.2 properties(属性)1.3 environments(环境配置)1.4 ty…

vue项目 element UI input框扫码枪扫描过快 出现数据丢失问题(已解决二)

项目需求: 输入框要掉两个接口,根据第一个验证接口返回的code,弹不同的框,点击弹框确认再掉第二个接口 根据客户现场反应,扫描枪快速扫描会出现 料号前几位字符丢失 不完整的问题。于是开始了测试之路。 解决方案探索 1.首先考…

数据可视化,销量第一的新能源汽车是什么?比亚迪新能源汽车销量接近60万辆

去年以来,新能源汽车火热度席卷全球,中国的新能源汽车无论制造或者销售,数量增长迅猛。下面小编用一款数据可视化软件,带你用可视化数据解读高端制造背后,中国新能源汽车的具体销售情况。同样如果你工作上有数据报表需…

[附源码]计算机毕业设计springboot酒店物联网平台系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

全国省市县 经纬度的 json数据(提供原文件),写Java代码,入库(提供代码)

目录 1 需求2 分析1 需求 有一个全国省市县 经纬度的 json数据,我想要使用代码入库 如何操作,代码咋写 2 分析 首先分析json结构, 一般拿到一个json数据,如果最外层不是 { } 包裹的,那么自己手动加一个 以上这个是自己加的,这个就是key 值就是list 集合 分析完json数…

【并发】深入理解Java线程的底层原理

线程基础知识 线程与进程 进程 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 线…

LDcad零件新增与导入

LDcad大颗粒小颗粒套装导入方法,以后LDcad也可以用套装搭建模型了。 LDcad大颗粒小颗粒套装导入方法, 以后LDcad也可以用套装搭建模型了。 有个遗憾,就是零件不全。 具体导入方法看下文。 我们可以看到。这些套装都有对应的图标。方便…

环境温湿度在线监测如何实现?有何应用场景?

温度、湿度等环境数据与人们生活生产息息相关。温湿度传感器作为能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置,广泛应用于工农业生产、气象、环保、国防、科研等经常需要对环境或设备的温度与湿度进行测量的领域,因此也产生了对温湿度远…

ASP.NET Core 3.1系列(15)——Entity Framework Core之DB First

1、前言 本文开始介绍一些关于Entity Framework Core的内容。在EFCore中,常用的为DB First模式和Code First模式,下面就来介绍一下如何在EFCore中使用DB First模式生成实体类和数据库上下文。 2、创建测试数据库 在SQL Server中新建一个数据库Dao&…

2016-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧

本系列博客合计 21 篇,每篇都将解析一张《信息资源管理》真卷,并附带答案解析与背诵技巧。 全国 2016 年 4 月自学考试信息资源管理试题(02378) 单选题 1、按信息表现形式划分,信息可分为(C) …

JavaScript的Web api接口

JavaScript的Web api 文章目录JavaScript的Web api选中元素事件操作元素获取/元素内容获取/修改元素属性获取/修改表单元素属性实现一个显示/隐藏 密码的功能实现一个加减计算器复选框全选/全不选获取/修改样式属性点击文字放大字体实现白天模式与夜间模式的切换操作节点新增节…

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&#xf…

3D漫游:所见即所得的形式,构建线上数字展厅

企业在数字化转型的大环境下,较为常用的当属数字展厅了,数字展厅能够为企业、行业协会、展销基地以及体验中心助力,以所见即所得的形式构建线上数字空间,满足企业的数字化展示和数字化营销。3D漫游,更加沉浸式的三维空…

使用 Hibernate Envers 进行实体审计

业务应用程序中的常见要求是在特定数据更改时存储版本控制信息;当某事发生变化时,谁改变了它,改变了什么。在这篇博文中,我们将介绍Hibernate Envers,它是Hibernate JPA库的一个组件,它为实体类提供了一个简单的审计/版…

【Linux网络配置实战】服务器Network静态路由配置

【Linux网络配置实战】服务器Network静态路由配置一、环境介绍1.环境规划2.实验目的二、检查各节点IP地址1.检查server01服务器上2.检查server02服务器网卡3.检查route01上的网卡三、在route01上启动IP包转发四、查看当前两节点互通情况1.查看server01和server02连通状态2.查看…

新手小白可以做什么互联网项目,副业项目应该怎么选择

现在网上的信息这么冗杂,有没有可靠的副业项目呢?怎样才能找到适合自己的副业呢? 说实话,在网上找副业并不难,搜索一下就会出来很多,但新手小白不知道如何选择,导致焦虑,一个重要的…

helm2.0安装及部署

一、helm简介 Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储&#xff09…

Linux 如何设置代理

安装部署 clash 是一款用 Go 语言开发的软件,所以我可以直接下载预编译的版本进行部署。 下载地址:https://github.com/Dreamacro/clash/releases/download/v1.8.0/clash-linux-amd64-v1.8.0.gz软件的作者提供了多种架构下预编译的二进制文件&#xff0…