扫码登录原理简析

我一直有用微信读书阅读的习惯,最近发现微信阅读还有网页版。登录微信阅读的网页版,须要咱们用App扫码进行登录。以下面的界面所示:前端

使用你的微信阅读App扫描完上面的二维码并点击确认登录后,网页版就能自动登录。登录后会展现你的阅读记录,书架信息等。web

我忽然很好奇,这个扫码登录究竟是怎么实现的,因此就去网上查了下相关的博客资料。这边记录下其中的一种比较简单好理解的实现方案。浏览器

实现细节

扫码登录的实现须要手机端的服务器和Web端的服务器配合实现。大体分为如下几步:安全

step1:网页端请求登录二维码服务器

直接先上图吧微信

要实现网页版的扫码登录,用户必须先要请求一个登录的二维码。Web端的服务器收到用户申请登录二维码的请求后,会随机生成一个uuid(这个uuid做为页面的惟一标识符),而且会将这个uuid当作一个键值对的key存入后台Redis。
存入Redis的这个键值对的value是什么咱们待会再说。ui

须要注意的是存入Redis的键值对必须设置一个过时时间,否则的话拿着这个uuid登录一次后就一直处于登录状态了。blog

当浏览器端拿到Web服务端返回的二维码信息后,解析其中的uuid,并拿这个uuid不断去后台轮询是否已经登录成功。若是后台已经登录成功,Web端就自动跳转到登录成功页面。否则的话会一直轮询,直到二维码失效(这里咱们发现给二维码设置有效时间
真的颇有必要,若是二维码没有有效时间的话,会不断的轮询后台,给后台形成很大的压力)。token

那么上面的关键点是Web端服务器是怎么判断用户是否已经扫码登录成功过的呢? 请看下面的步骤。开发

step2:手机端将用户id存入Redis

用户请求到二维码后,就开始拿出手机,打开相应的App扫描二维码。扫描过程当中手机会将uuid和手机端登录后得到的token信息一块儿提交到手机端服务器。

手机端服务器会先拿token信息判断这个用户是否合法,是否已经正常登录。若是判断已经正常登录,那么会将这个用户的userId和提交过来的uuid当作一个键值对(uudi-userId)存入Redis。这边回答了步骤一种留下的问题。

简单来说手机端作的工做就这么多。让咱们继续回到Web端。

step3:web端轮询成功

步骤一中讲到:二维码登录页会不停的轮询是否登录成功。这边的依据就是Redis中存在uuid-userId键值对。若是这个键值对已经存在,说明手机端已经扫码登录过。

Web端服务器一旦判断到手机端已经扫码登录过,就能够拿着userId进行登录。并将必要的用户信息和token信息返回Web前端。至此Web端登录成功。

简单总结

本文记录了一个扫码登录的简单版本,可是也能描述扫码登录的大体原理。实际开发过程当中应该仍是有许多细节须要考虑。好比安全问题等。具体的仍是须要咱们进行实战了。

欢迎你们一块儿讨论~

相关文章
相关标签/搜索