在看面试题的时候,看到了一篇比较有意思的场景题——如何实现一个扫码登录功能
我们在日常登录网站时,经常会使用到扫码登录这个选项,如果要理解背后原理,我们可以从最简单的用户登录场景切入:
基础的使用账号密码登录背后逻辑很简单:
流程很简单,核心就在于验证账号密码生成了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 删除。