前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >扫码登录的背后原理是什么

扫码登录的背后原理是什么

原创
作者头像
潋湄
修改2025-01-17 21:54:21
修改2025-01-17 21:54:21
1160
举报

在看面试题的时候,看到了一篇比较有意思的场景题——如何实现一个扫码登录功能

基本的账号密码登录

我们在日常登录网站时,经常会使用到扫码登录这个选项,如果要理解背后原理,我们可以从最简单的用户登录场景切入:

基础的使用账号密码登录背后逻辑很简单:

正常使用账号密码的登录原理
正常使用账号密码的登录原理

流程很简单,核心就在于验证账号密码生成了token这一步,之后客户端如果要向服务端请求数据携带token进行请求即可,那么扫码登录本质上也是要解决这个问题:

如何通过扫码确认,来判断用户的信息是否正确

本地应用扫码登录

扫码登录也分为不同场景,有使用淘宝这种本地APP登录PC端淘宝官网的场景,也有使用微信这种第三方应用登录其他应用的,这里我们先来探讨一下本地应用扫码登录的背后原理

一般来说,二维码只是一个随机生成的像素图片,生成二维码包含前端后端两层处理:

前端层面:通过qrcode等组件库生成像素图片

后端层面:生成唯一的一个UUID来与这个二维码图片相对应

二维码生成后,后端会维护二维码的几个状态:

待扫描:指二维码刚刚生成,还未被扫描

待确认:二维码已经被扫描,但是还未被确认

已授权:登录信息已经被用户确认,这时已经可以访问网站信息

已过期:一般来说,网站的登录二维码会设置过期时间,如果超过过期时间会失效

由于登录网站的过程是一个比较迅速的过程,因此我们可以使用Redis来短暂设置二维码登录的对应状态,同时Redis也能够支持设置过期时间

而具体请求的流程大致如下:

本地应用扫码流程分析
本地应用扫码流程分析

这里主要分为以下几个核心流程:

1、用户发起二维码请求

网站会生成二维码,将二维码的唯一UUID保存起来,之后返回二维码信息,浏览器展示的同时,会进行一个轮询操作,判断这个二维码是否已经被扫描了,这里轮询可以有两种方法实现,一种是前端的轮询操作,另一种是WebSocket实现,通过后端监控二维码状态进行实时推送,后者相对于前者来说,响应更加迅速,但是其实一般情况下使用前端代码每1进行轮询检查已经能够满足要求了

2、用户扫码确认登录

用户用手机APP扫码登录后,APP会提取二维码的登录信息,显示登录确认页面,这个页面可以是APP本地的Native页面,点击确认后,APP就会将二维码信息与手机上面已经登录的Token信息提交给网站API,网站验证token有效后,便会更新二维码状态为已授权

3、网站授权成功

发起扫码状态的轮询在判断二维码状态为已授权后,便会发起网站请求,与网站建立一个Session请求,调用起始页面,用户便可以正常使用网站了

在使用二维码登录的过程中,回向服务端发起两次服务请求,而这两次服务请求所携带的token信息是不同的,在手机端扫描二维码后会使用临时token进行信息确认,而在已授权后,则会生成一个永久token保存在客户端,每次访问携带这个永久token即可

第三方应用扫码登录

第三方应用二维码登录的请求流程就略显复杂了:

第三方应用二维码登录
第三方应用二维码登录

以使用微信登录举例,这里有几个地方值得我们注意:

1、在第三步生成请求记录这里,用户在手机上同意登录后,这时登录应用并没有用户信息,我们还需要从微信开放平台中获取用户信息,但是由于请求确认机制,我们必须要携带对应的有效信息进行确认才可,这时就必须要在请求的url后面携带对应的应用State信息才能获取到最终对应的用户信息

2、微信开放平台其实可以比喻为一个巨大的容器,里面有众多的第三方授权应用,我们每次在新的第三方应用登录就是往里面添加元素,登录以前用过的应用就是获取了原来的信息,比如我们在第17步进行请求授权信息就是对微信开放平台中应用的确认

3、在第27步携带授权Code+应用id+应用密钥请求微信开放平台进行验证,这里的授权Code其实就是临时token,也可以称为access token,这个token仅可以在向微信开放平台时可以使用一次,且必须携带对应的应用id与应用密钥信息,应用id一般为用户被分配到的应用id,而应用密钥一般会加密保存应用内部中不会丢失,而这个access token如果过期,开放平台还会发放一个refresh token来让用户进行请求登录,从而最终能够完成授权,而这个技术也被称为OAuth 2.0,它的核心目的是:

第三方应用无需提供账号密码便可以获取用户信息,其实现的关键核心就在于:生成临时token来进行确认登录

至此,本文的内容就全部结束了,关于扫码登录背后的逻辑还是很有趣的,希望对你有所帮助!!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本的账号密码登录
  • 本地应用扫码登录
  • 第三方应用扫码登录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档