起初的想法是类似于QQ扫码登录,BILIBILI扫码登录一样,通过手机确认后,在web端重定向完成登录

通过对BILIBILI扫码功能的解析,自己实现了一套类似扫码登录的功能

以下为伪代码,仅供查阅

前端

需要两个路由,两个页面

login提供Web端用户登录和扫码

图片仅提供扫码展示,密码登录不写了

login2提供给跨端用户(如手机端)扫码进入

主要为二次确认,提供确认登录和取消登录

确认登录后,页面跳转至localhost:3000

后端

功能需求:

  1. 用户访问请求登录,获取登录ID,并存储其状态为false

  2. PUT用户根据登录ID确认登录,当状态为False是,修改为TRUE(需要权限验证)

  3. 提供当前登录ID信息查询

后端实现

  1. 生成登录ID,并返回前端
 let code = (Math.random() * 100000).toFixed(0);let data = {qr_title: code,    //登录IDqr_status: false,  //登录状态,未登录为False};return await this.qrService.create(a);

2.用户通过二维码访问确认登录页,确认登录

 @Put('/ConfirmLogin')async ConfirmLogin(@Query() chaxun: any): Promise<any> {return await this.qrService.confirm(chaxun);}
  async confirm(dto?: any): Promise<any> {try {let data: Array<any> = await this.qrRepository.find({qr_title: dto.qr,});if (data.length > 0 && !data[0].qr_status) {data[0].qr_status = true;this.qrRepository.save(data[0]);} else {}} catch (error) {throw new BadRequestException(`系统错误`);}}
  1. 轮询请求状态
 @Get('/login')async login(@Query() chaxun: any): Promise<any> {console.log(chaxun);return await this.qrService.login(chaxun);}
async login(dto?: any): Promise<any> {try {let data: Array<any> = await this.qrRepository.find({qr_title: dto.qr,});if (data[0].qr_status) {return { loginStatus: 'OK' };} else {return { loginStatus: 'NOOK' };}} catch (error) {throw new BadRequestException(`系统错误`);}}

前端实现

引入QrCode库,根据请求的登录ID生成二维码,将参数带入手机确认登录页

同时该页面轮询登录状态,登录成功后,跳转至网站内容页

Login1

import React, { Component } from 'react';
import axios from '../utils/http';
import { message } from 'antd';
var QRCode = require('qrcode.react');
export default class LoginRouter extends Component {code: number = 0;number: number = 0;hello: any = null;render() {console.log(this.code);console.log(this.props);return (<div><QRCode value={`http://192.168.1.125:3000/login2?qr=${this.code}`} />,</div>);}tick = async() => {this.number += 1; const res = await axios.get<{ loginStatus:string }>(`http://localhost:4000/qr/login?qr=${this.code}`);console.log(res.data);if (res.data.loginStatus==='OK') {let a: any = this.props;message.success('登陆成功');a.history.push('/');}};componentDidMount() {axios.get('http://192.168.1.125:4000/qr').then(res => {this.code = res.data.code;this.setState({});});this.hello = setInterval(this.tick, 1000);}componentDidUpdate() {// 组件更新后触发console.log('componentDidUpdate');}componentWillUnmount() {// 组件卸载时触发clearInterval(this.hello);console.log('componentWillUnmount');}
}

Login2

手机登录页面确认后,提交确认状态,交给主登录页轮询状态

import React, { Component } from 'react';
import axios from '../utils/http';
import { message } from 'antd';export default class LoginRouter2 extends Component {code: number = 0;render() {let a: any = this.props;let qr = a.history.location.search.split('=')[1];return (<div><buttononClick={() => {axios.put(`http://192.168.1.125:4000/qr/ConfirmLogin?qr=${qr}`).then(res => {message.success('成功');});}}>确认</button><buttononClick={() => {alert('请关闭');}}>取消</button></div>);}componentDidMount() {//   axios.get('http://192.168.1.125:4000/qr').then(res => {//     this.code = res.data.code;//     this.setState({});//   });}
}

只是理论可行,实际应用还需要判断其权限,手机端授权,页面端登录权限验证等,以及前端页面的扫码状态展示,扫码回执操作等

当然二维码也未必是指向本文章中的login2 如手机端可通过自定义协议访问,比如支付宝或微信付款吗alipay://
GIF示例-PC

GIF示例-Mobile


文章来源:JoyNop.COM–跨端扫码确认实现Web登录(扫二维码登录)
https://www.joynop.com/p/235.html

跨端扫码确认实现Web登录(扫二维码登录)相关推荐

  1. 微信扫码登录自定义二维码样式

    微信扫码登录自定义二维码样式 前言 Java生成data-url 1.工具类pom 2.代码实现 将data-url赋值给href 前言 今天在做web端扫码登录时,前端需要定义二维码的样式.官方文档 ...

  2. Spring Cloud OAuth2 扩展登录方式:帐户密码登录、 手机验证码登录、 二维码扫码登录

    本文扩展了spring security 的登录方式,增长手机验证码登录.二维码登录. 主要实现方式为使用自定义filter. AuthenticationProvider. AbstractAuth ...

  3. 微信扫码登录自定义二维码显示信息

    微信扫码登录,自定义二维码显示信息 <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js& ...

  4. 12306抢票系统(登录功能---二维码+账号密码)

    文章目录 一.二维码登录方式 二.账号密码登录方式 超级鹰第三方库 账号密码登录 代码汇总: 一.二维码登录方式 二维码登录方式:用户手机端扫描网页二维码登录,比账号密码登录更简易 话不多说,先上代码 ...

  5. jq将网页生成二维码插件 给网站内页添加手机扫码访问教程 给网站添加二维码教程 网站如何生成二维码

    很多用户通过电脑访问了你的网站,可能某些他想手机查看,那么刚好用的这个功能,这个鹏仔简单写了下,电脑端屏幕大于1198的会显示二维码,小于则当做移动端或ipa隐藏不显示. 本次需要引入jq,如果你的站 ...

  6. Mac pro微信开发者工具无法显示登录的二维码解决方案

    一开始在微信小程序里是使用测试号开发的,更改测试号为自己的AppId死活改不了,报错: Error: 需要重新登录,access_token expired[touristappid] 1.首先要确保 ...

  7. vue编写一个登录页面,使用Tab栏实现“账号登录”和“二维码登录”这两种方式的切换

    编写一个登录页面,使用Tab栏实现"账号登录"和"二维码登录"这两种方式的切换,并通过transition组件结合animate.css实现切换时的动画效果 1 ...

  8. 网址二维码:如何制作网页链接二维码?

    1994年,一家日本的公司发明了二维码,最开始是用来追踪旗下公司零部件的维修情况.在二维码上有不同的区域,标识不同的信息,比如对齐模式.定时模式.安静区域.版本信息.数据单元等. 现如今二维码和我们的 ...

  9. ZXing 二维码库之生成与解析二维码

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  10. 生成有时间限制的二维码_微信公众号渠道二维码怎么制作?监测渠道效果的利器来了...

    每逢营销节点,各种渠道推广少不了,非常时刻需要能够统计不同渠道二维码的数据情况. 微信引流效果好不好怎么判断?新增人数为什么一团乱麻?粉丝又分别是从哪个渠道来的? 用渠道二维码就能搞定这些问题. 一. ...

最新文章

  1. 【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
  2. Exchange Technical community discussion group
  3. 【面试必会】editplus使用教程java
  4. Swift标准库源码阅读笔记 - Array和ContiguousArray
  5. Android Coroutines Channels
  6. Java虚拟机:JVM 主要组成部分与内存区域
  7. 虚拟化技术知识点初步梳理
  8. Flink-java读取Kafka(转载+自己验证)
  9. mysql调试.net_需要有关使用.NET和MySQL调试应用程序的帮助
  10. 你会通过Docker部署war包吗
  11. vrp 节约算法 c++_滴滴技术:浅谈滴滴派单算法
  12. JeecgBoot版本4月份新版即将发布,抢先体验。。
  13. html表格分页打印样式,vue部分打印(多页自动分页、打印样式自定义、多页打印表格页面顶部带表头)...
  14. oracle 还原归档,ORACLE RMAN 还原归档日志
  15. C++ 函数重载的实现原理
  16. python爬虫从小白到高手 Day1 爬取百度音乐歌单
  17. 机器学习基础(二十六)—— 将 SVM 推广到多类问题
  18. CloudStack 4.4学习总结之注册ISO
  19. NVR和DVR有什么区别
  20. Postman中文版,竟如此简单,秒变中文

热门文章

  1. Lecture19_相机、透镜与光场(Cameras, Lenses and Light Fields)_GAMES101 课堂笔记
  2. python项目实战:selenium控制浏览器自动登录扣扣_zone
  3. 45个纯 CSS 实现的精美边框效果【附源码】【上篇】
  4. 扒一扒最让人后悔的专业,你躺枪了吗?
  5. 魅族应用上传应用市场空包签名的问题,快捷解决方案!
  6. 外贸邮件群发的技巧:外贸客户邮箱搜集方法大全
  7. 上市后的第一份财报,藏着满帮的两把双刃剑
  8. 拓嘉启远:拼多多层级提高后有什么用?
  9. 基本指令的编程练习-PLC认识实验-定时器/计数器功能实验
  10. Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器