微信扫码登录的一种开发思路

article/2025/9/13 2:40:09

微信扫码授权登录流程:

  1. 用户在显示二维码的页面用手机扫码授权
  2. 页面跳转到指定地址,URL上带有参数code
  3. 前端通过code向服务端请求用于权限认证的token
  4. 前端后续请求在请求头带上token作为身份标识

需要解决的问题

按照上述的流程,前端最简单的做法就是扫完码重新跳转回系统后,从URL获取code进行后续的操作。

然而因为公司的实际情况,整个扫码登录的流程并没有这么简单。

扫码后只能跳转到固定域名

首先,微信扫码后跳转的域名是固定的,但是一般公司的项目在不同的开发(或生产)环境的域名是不一样的,这样就造成用户扫完码以后无法跳转到正确的系统地址。

解决这个问题的思路就是搭建一个中转平台,当扫完码跳转到中转平台后,中转平台在系统对应的开发(或生产)环境地址加上code参数,然后进行跳转,系统在URL里拿到code以后即可进行后续操作。

内嵌二维码

其次,公司领导要求用来登录的二维码需要内嵌到系统自身的登录页中,而不是单独打开个页面显示二维码。

解决这个问题也很简单,我们可以通过iframe将二维码页面内嵌到系统的登录页面,用户扫码后在iframe内部跳转到中转平台,中转平台通过主动推送的方式(比如WebSocket、PostMessage这些,不仅能主动推送而且能跨域主动推送。)向iframe外层的系统推送code,系统接收到code以后进行后续操作。

懒得把中转平台搞成服务

不过问题又来了。主动推送是指服务端能向客户端主动推送信息,而无需等客户端请求以后才能响应信息。在上述的登录流程中,中转平台就相当于服务端,向系统主动推送code。但是我们公司目前并没有部署node项目的经验,而且部署后需要花费精力对中转平台进行维护。

那么还有什么简单的方法可以让中转平台和系统之间进行通信呢?LocalStorage(或者SessionStorage)可以做到。我们可以在中转平台通过LocalStorage在浏览器缓存中存储code,跳转回系统以后,系统从浏览器缓存中获取code。

不过LocalStorage的不足之处在于无法做到跨域通信,不同域之间的缓存是不能共享的。但是好在我们公司的所有项目在某个开发(或生产)环境内都是部署在同一域名下,只是不同的项目拥有不同的路径,这样相同域名下的中转平台和系统是可以共享缓存的。同时,中转平台就可以单纯是一个静态页面,而无需搞成node服务。

完整的登录流程

综上,整个具体的登录流程就是这样:

请添加图片描述

  1. 通过iframe将二维码页面内嵌到系统的登录页面中
  2. 用户扫码以后,在iframe内跳转到生产环境的中转平台,跳转的地址内携带了当前系统所在开发(或生产)环境的域名参数以及code参数。
  3. 生产环境的中转平台从URL中获取域名参数,并携带code参数跳转到对应域名的中转平台。
  4. 对应域名的中转平台将code用LocalStorage进行缓存,并跳转到对应域名的系统。
  5. 系统从缓存中获取code,并用code向后端请求后续用于权限认证的token。

代码实现

系统erp:

const BeforeScan: FC = () => {useEffect(() => {const nextUrl = `${window.location.protocol}//${window.location.host}/passport`const redirect_url = encodeURIComponent(`https://amazing.com/passport?redirect=${nextUrl}`,)// @ts-ignoreconst wwLogin = new WxLogin({self_redirect: true,id: 'login_container',appid: appid,scope: 'snsapi_login',redirect_uri: redirect_url,state: UUID.generate(),style: '',href: '',})}, [])return <div id='login_container' />
}const Login: FC = () => {const timer = useRef<NodeJS.timer | null>(null)const getCode = () => {const msg = JSON.parse(sessionStorage.getItem('passport__wechat_login_code') || '{}',)return msg?.code}const resetMsg = () => {sessionStorage.removeItem('passport__wechat_login_code')clearInterval(timerRef.current as NodeJS.Timer)timerRef.current = null}const loginLogic = () => {const code = getCode()if (code) {resetMsg()getToken(code)}}useEffect(() => {timerRef.current = setInterval(loginLogic, 1000)return () => {resetMsg()}}, [])return (<div><BeforeScan /></div>)
}

中转平台passport:

var urlParams = new URLSearchParams(window.location.search)
var code = urlParams.get('code')
var redirect = urlParams.get('redirect')// 异步调用 window.location.replace,防止一些异步操作未完成
function replaceUrl(url) {setTimeout(function () {window.location.replace(url)}, 500)
}function handleLogin() {var timestamp = (Date.now() / 1000) | 0var obj = { code: code, timestamp: timestamp }window.sessionStorage.setItem('passport__wechat_login_code',JSON.stringify(obj),)replaceUrl('/erp')
}// 从 query 中获取 redirect url 并跳转到相应的域名(用于通过 amzaing.com 登录测试环境的 erp)。
// 跳转时保留当前所有的 query,但是要去除 redirect。
function handleRedirect() {if (redirect) {var redirectUrl = new URL(redirect)urlParams.forEach(function (value, key) {if (key != 'redirect') {redirectUrl.searchParams.set(key, value)}})replaceUrl(redirectUrl.toString())return true}return false
}function main() {var redirected = handleRedirect()if (!redirected) {handleLogin()}
}main()

不足之处

上面这种扫码登录方式存在一些不足之处:

  • 前端在本地起的环境是无法实现扫码登录的。因为上面这样方式需要系统和中转平台在相同域下,对于本地环境来说某个端口已经被系统占用,那么中转平台就无法使用这个端口了。
  • 需要进行三次页面跳转,登录等待时间过长。

所以,扫码登录最好的方式还是需要把中转平台构建成一个真正的系统服务,这样中转平台就可以向系统主动推送数据。而且,把中转平台搭建成系统服务以后,可以把所有系统的登录逻辑都集成到中转平台,由此构建一个统一登录平台,这样其他系统无需再关注登录逻辑。


http://chatgpt.dhexx.cn/article/geb0kBJk.shtml

相关文章

java集成微信扫码登录

具体流程可以看微信官网的扫码登录文档 地址&#xff1a;https://open.weixin.qq.com/cgi-bin/showdocument?actiondir_list&tresource/res_list&verify1&idopen1419316505&token&langzh_CN 一、 前期准备 1、注册 微信开放平台&#xff1a;https://open…

企业微信扫码登录

企业微信扫码登录步骤&#xff1a; 1.首先在要放置二维码的页面提供一个盒子用于防止生成的二维码 2.在当前页面将企业微信提供的js进行引入 3.调用提供的方法实例&#xff0c; 4.要获得扫码成功之后的code和state值&#xff0c;调用服务&#xff0c;就能查到当前用户的token&…

扫描微信二维码实现快速登录

一、什么是二维码 二维码又称二维条码&#xff0c;常见的二维码为QR Code&#xff0c;QR全称Quick Response&#xff0c;是一个近几年来移动设备上超流行的一种编码方式&#xff0c;它比传统的Bar Code条形码能存更多的信息&#xff0c;也能表示更多的数据类型。二维条码/二维码…

个人网站如何使用微信扫一扫登录---SpringBoot项目

文章目录 前言一、码上登录是什么&#xff1f;二、使用步骤1.登录前准备&#xff0c;获取SecretKey2.前端发起登录请求3.后端调用“码上登录”服务器3.1. 配置文件3.2. 发起请求3.3.返回的参数 4.前端显示二维码5、扫一扫登录6 、登录成功后接收用户信息7、通知前端登录成功并返…

微信扫码登录是如何实现的?

网页版微信刚推出时&#xff0c;无数人被它的登录方式惊艳了一下&#xff0c;不需要输入用户名密码&#xff0c;打开手机微信扫一扫&#xff0c;便自动登录。从原理上讲&#xff0c;二维码只能是一段文本的编码&#xff0c;如何用它实现快捷登录的呢&#xff1f; 打开网页版微…

Python 最强 IDE 详细使用指南!

本文经机器之心&#xff08;微信公众号&#xff1a;almosthuman2014&#xff09;授权转载&#xff0c;禁止二次转载 选自RealPython&#xff0c;作者&#xff1a;Jahongir Rahmonov 机器之心编译&#xff0c;参与&#xff1a;魔王 PyCharm 是一种 Python IDE&#xff0c;可以帮…

用 Python 给全球女神颜值排个序

点击上方“码农突围”&#xff0c;马上关注&#xff0c;每天上午8:50准时推送 这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包 真爱&#xff0c;请设置“星标”或点个“在看” 作者 | 数据森麟 来源 | 数据森麟&#xff08;ID: shujusenlin&#…

官宣:Python 3.8正式发布!来看看有哪些新功能

点击上方“码农突围”&#xff0c;马上关注&#xff0c;每天上午8:50准时推送 这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包 真爱&#xff0c;请设置“星标”或点个“在看” 来源&#xff1a;.python.org 编辑&#xff1a;肖琴&#xff0c;转自…

人工智能可以产生自主意识吗?

作者&#xff1a;人民邮电出版社 链接&#xff1a;https://www.zhihu.com/question/372639666/answer/1343242547 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 「既然人类对自己存在的认知来源于“感知”和“记忆…

CET6 历年真题原词复现 核心词汇 做题技巧 听力拿分技巧汇总(这篇文章是英语四六级考试最后的版本,谢谢大家一路陪伴)

话不多说直接进入 这次是最后一次 也是最用心的一次关于CET6的整理&#xff0c;CET4很简单&#xff0c;我认为没有必要去整理或者帮助各位同学&#xff0c;cet4只是cet6的前置任务罢了&#xff0c;但要是你说你考完cet4就收手了&#xff0c;不考了&#xff0c;不考6级了。我只…

这一款神器,助你秒级定位线上问题!

点击上方“Github中文社区”&#xff0c;关注 触达Github项目来源&#xff1a;https://my.oschina.net/leejun2005/blog/1524687 背景 经常做后端服务开发的同学&#xff0c;或多或少都遇到过 CPU 负载特别高的问题。 尤其是在周末或大半夜&#xff0c;突然群里有人反馈线上机器…

前端工程师高手说说CSS学习中的瓶颈

一、何为瓶颈&#xff1f; “瓶颈”指瓶子的颈部&#xff0c;相对狭窄。这是很传神的一个词&#xff0c;因为狭窄&#xff0c;因此难以突破&#xff1b;但是&#xff0c;一旦突破了&#xff0c;就是广阔天空&#xff08;偌大瓶身&#xff09;&#xff01; 小弟不才&#xff0…

线上服务 CPU 100%?一键定位 so easy!

转自&#xff1a;大数据之路&#xff0c; 链接&#xff1a;my.oschina.net/leejun2005/blog/1524687 背景 经常做后端服务开发的同学&#xff0c;或多或少都遇到过 CPU 负载特别高的问题。 尤其是在周末或大半夜&#xff0c;突然群里有人反馈线上机器负载特别高&#xff0c;不熟…

线上服务 CPU 100% ?一键定位 so easy!

来源&#xff1a;my.oschina.net/leejun2005/blog/1524687 背景 经常做后端服务开发的同学&#xff0c;或多或少都遇到过 CPU 负载特别高的问题。 尤其是在周末或大半夜&#xff0c;突然群里有人反馈线上机器负载特别高&#xff0c;不熟悉定位流程和思路的同学可能登上服务器一…

牛逼的故障诊断工具!秒级定位线上问题

背景 经常做后端服务维护或开发的同学&#xff0c;或多或少都遇到过CPU 负载特别高的问题。尤其是在周末或大半夜&#xff08;有没有同感&#xff0c;平时不出问题&#xff0c;一到休息或下班时间频繁出故障&#xff0c;有的文末点个在看示意一下&#xff09;&#xff0c;突然群…

推荐一款神器,助你秒级定位线上问题!

来源&#xff1a;my.oschina.net/leejun2005/blog/1524687 背景 经常做后端服务开发的同学&#xff0c;或多或少都遇到过 CPU 负载特别高的问题。 尤其是在周末或大半夜&#xff0c;突然群里有人反馈线上机器负载特别高&#xff0c;不熟悉定位流程和思路的同学可能登上服务器一…

最牛逼的故障诊断工具!秒级定位线上问题

点击下方公众号「关注」和「星标」 回复“1024”获取独家整理的学习资料&#xff01; 背景 经常做后端服务维护或开发的同学&#xff0c;或多或少都遇到过CPU 负载特别高的问题。尤其是在周末或大半夜&#xff08;有没有同感&#xff0c;平时不出问题&#xff0c;一到休息或下班…

WheelView地区选择三级联动详解

1. 效果 最近需要做一个地区选择的功能&#xff0c;但是在网上和github上找了很久都没找到满意的&#xff0c;然后朋友推荐了一个给我&#xff0c;我花了点时间把代码大致看懂并改成我想要的&#xff0c;并写上我的理解。效果如图&#xff1a; 2. 注意 a. 首先我们要明白…

如何用美剧真正提升你的英语水平————转自厦大口译的博客

看到很多童鞋讨论有关美剧学习英语到底有没有用&#xff0c;以及用哪部美剧练习&#xff0c;我在这里想说这只是一个参考&#xff0c;世界上没有绝对的事情&#xff0c;究竟有没有用看个人 1. 不是所有的美剧都适合学英语 如果喜欢看如《24小时》这样的动作片, 那你基本会讲一口…

美剧命名规则

缘起 最近工作需要研究了下ffmpeg这个工具.在查资料的时候意外发现美剧制作组发布的美剧的名字是有规则的. 美剧命名规则 剧名.S季数E集数.集名(可以不标).发布年代(可以不标).分辨率(可以不标).信号采集源.音频编码(默认的MP3可以不标).视频编码-制作组 下面举例子说一下吧. 例…