前言
说一下网页扫码登录的原理是什么?
嗯哼~ 说到扫描登录大家都很熟悉了,目前主流网站都有扫码登录的功能。那么这个扫描登录的原理是什么呢?
小脑袋瓜飘过两个关键信息:
1、轮询
2、socket
这两个点都是关注监听二维码是否被用户扫描,及是否点击登录。 再细一些的原理,咱得好好研究一下,跟着我一起学习这个网页扫码登录的原理吧~
扫码登录原理
扫码登录,可以分为移动端与服务端的交互 和PC端与服务端的交互两个过程。
PC端与服务端
- 当用户打开登录页面时,页面会发起一个向服务器发送获取登录二维码的请求。
- 服务器接收到请求后,随机生成一个uuid(唯一标识),将这个uuid存入服务器中,同时设置一个过期时间,如果过期,需要重新获取二维码。
- 把uuid和校验信息生成二维码,将二维码和uuid返回给PC页面。
- PC页面拿到二维码和uuid后,发起轮询。轮训有两种情况:
- 一种是登录成功,
- 一种是二维码过期,过期需要提醒用户刷新二维码。
移动端与服务端
- 移动端扫码之后,会得到验证信息和uuid。因为移动端是已经登录过的,所以,本地有当前的用户信息(token、userId等),移动端将需要带上用户信息和校验信息,向服务端发送登录请求。
- 服务器收到请求之后,对比参数中的验证信息,确定是否为用户登录请求接口,如果是,返回一个确认信息给移动端。
- 移动端收到返回后,将登录确认框显示给用户,用户确认是进行的登录操作后,移动端再次发送请求。
- 服务器拿到uuid和移动端的用户信息后,修改用户的状态,将登录成功的状态和用户信息返回给PC端。
- PC端轮询得到登录成功的状态,获取登录信息,登录成功
图解
PC端检查二维码的状态不止轮训一种方式,还有我们熟悉的socket也是可以的
- socket的方式: PC端保持着与服务器的长链接,当手机端扫描二维码之后,带着解析器得到的二维码ID第一次发送给服务器,当服务器收到这个请求后,代表用户已经扫描了二维码,这时服务器就可以通过socket告知PC端二维码已被扫描,等待确认;之后手机端不论是取消登录还是确认登录,都会相应的请求服务器,服务器收到请求会根据相应的逻辑处理,进而通知PC端更新相应的状态。
- 轮询方式:轮询方式即在PC端创建一个定时器,每个一段时间请求服务器查询状态的更新情况,然后更新网页的显示信息。当时这个定时器得控制好启动时机和生命周期,因为PC端二维码有可能一直没有被扫描,或者扫描之后没有下一步操作了,这时,如果没有控制好这个定时器,PC端就会一直地请求服务器查询,造成资源浪费和一定的性能损耗。
以微信读书扫码登录为例
step1 网页端请求登录二维码
用户点击登录, PC端请求一个登录二维码。Web端的服务器收到用户申请登录二维码的请求后,会随机生成一个uid(uid作为页面的唯一标识符)。并且会将这个uuid当做一个键值对的key存入后台Redis。
存入Redis的这个键值对的value是什么我们待会再说。
需要注意的是存入Redis的键值对必须设置一个过期时间,不然的话拿着这个uuid登陆一次后就一直处于登陆状态了。
当浏览器端拿到Web服务端返回的二维码信息后,解析其中的uuid,并拿这个uuid不断去后台轮询是否已经登陆成功。如果后台已经登陆成功,Web端就自动跳转到登陆成功页面。不然的话会一直轮询,直到二维码失效(这里我们发现给二维码设置有效时间 真的很有必要,如果二维码没有有效时间的话,会不断的轮询后台,给后台造成很大的压力)。
那么上面的关键点是Web端服务器是怎么判断用户是否已经扫码登陆成功过的呢? 请看下面的步骤
step2 手机端将用户id存入Redis
用户请求到二维码后,就开始拿出手机,打开相应的App扫描二维码。扫描过程中手机会将uuid和手机端登陆后获得的token信息一起提交到手机端服务器。
手机端服务器会先拿token信息判断这个用户是否合法,是否已经正常登陆。如果判断已经正常登陆,那么会将这个用户的userId和提交过来的uuid当做一个键值对(uudi-userId)存入Redis。这边回答了步骤一种留下的问题。
简单来讲手机端做的工作就这么多。让我们继续回到Web端
step3 web端轮询成功
步骤一中讲到:二维码登陆页会不停的轮询是否登陆成功。这边的依据就是Redis中存在uuid-userId键值对。如果这个键值对已经存在,说明手机端已经扫码登陆过。
Web端服务器一旦判断到手机端已经扫码登陆过,就可以拿着userId进行登陆。并将必要的用户信息和token信息返回Web前端。至此Web端登陆成功。
目前查看接口没有发现web端有不断轮询调用接口, 目测使用的是socket连接的方式判断是否扫描和登录的。
PC端保持着与服务器的长链接,当手机端扫描二维码之后,带着解析器得到的二维码ID第一次发送给服务器,当服务器收到这个请求后,代表用户已经扫描了二维码,这时服务器就可以通过socket告知PC端二维码已被扫描,等待确认;之后手机端不论是取消登录还是确认登录,都会相应的请求服务器,服务器收到请求会根据相应的逻辑处理,进而通知PC端更新相应的状态。