题引:
心血来潮写这篇文章的原因是因为上周五秋招面试的时候,面试官根据我的简历问了我一个问题: 讲讲实现扫码登录功能的思路 。好家伙,我刚好没有实现类似的功能,但根据之前做PC端的基于非对称加密的账号密码登录功能,我就根据token的思路跟面试官互相拉扯,所幸对方说思路基本没错。面完之后就私下查了查相关文档,现在就来开干。
正文:
日常的生活中很多程序都用到了扫码登录,其实我们来分析一下,我们会发现它会设计到三中角色:PC端、手机端、服务端。每种角色都会对应着自己负责的任务。
在讲二维码实现之前,我们需要先来讲一下账号密码登录的流程和手机认证机制。
账号密码登录
如果是普通的账号密码登录方式,PC端通过账号密码登录,第一次的话会把账号密码以及相关信息发送给服务端,服务端就会根据PC端传过来的信息进行加密存储,并返回一个token之类的标识。当PC端再次请求服务端时,需要携带token这个标识。服务端响应的时候,需要对token进行解密校验和数据库查询,校验通过则正常登录;校验不通过或者token过期,PC端都需要再次登录验证来获取的新token标识。
这就是为什么有时候我们使用一个已经登录过的网站可以直接登录,以及有些网站长期不用之后需要重新登录,绝大部分跟token有关。当然,有些网站不一定是用token,也有用cookie、sessionId。但安全性没有比token好。
手机认证机制
我们会发现,我们在手机下载App的时候,除了第一次登录的时候需要进行认证,后面不管是把进程去掉,还是重启手机,都不需要重新输入账号密码登录。这是因为手机内部是有一套认证机制的,它和PC端很相似但又有些不同。
当我们进行App登录认证时,除了账号密码之外,其实是还有手机设备这些信息的。当我们登录认证之后,手机端会把账号与设备信息进行绑定,进行 持久化 的保存。这个数据包括账号ID、设备ID、设备其它信息等等。又因为 手机设备的信息 是唯一的,那么就可以为手机端生成一个唯一的且持久化不过期的token,这也是为什么我们在手机可以长久使用账号的原理。
二维码是什么及怎么实现
1.二维码是什么?
二维码可以理解成是登录凭证的 具体物 ,里面包含登录的凭证信息。
1.PC端做了什么?
首先,当我们访问一个实现二维码登录的网站时,PC端会向服务端发送请求,服务端响应并返回 二维码唯一Id、过期时间、二维码状态(未扫描、已完成、已失效) 等等信息,PC端拿到之后根据这些信息生成二维码。
2.手机端扫码时内部做了什么?
当我们用手机端进行扫码的时候,手机端将获取到的 二维码Id 同 手机端的 token 一同发送给服务端进行验证。服务端接到请求之后对手机端token进行验证,并根据手机端token和二维码Id生成PC端 token 并且修改二维码状态 。
3.PC端后续做了什么?
PC端在生成二维码之后,会通过轮询的方式反复请求服务端,通过二维码Id获取二维码状态。如果状态为已成功,则服务端返回PC端token,登录成功;反之则不断轮询。
二维码实现流程
- 手机端访问PC端二维码生成页面,PC端请求服务端来获取二维码Id;
- 服务端收到客户端请求,生成对应的二维码Id,设置二维码状态,过期时间等等相关信息;
- PC端收到服务端发送回来的二维码Id,据此生成对应的二维码;
- 手机端扫描二维码获得二维码Id,并将手机端的token一起发送给服务端,进行确认;
- 服务端收到请求后,验证手机端的token,且根据手机端token和二维码Id生成PC端token;
- PC端通过多次轮询的方式向服务端进行请求,携带二维码Id来获取二维码状态。如果获取的二维码状态为已成功,而登录成功;反之继续轮询请求。
收尾
以上就是二维码实现的具体流程。后续配上图解和文案。如果有什么书写错误的,烦请指正。