- 背景
有Web端+App端的应用如:学习强国、京东、支付宝、微信等,Web登录页面有扫码登录方式。我司的产品有类似的情况,也都是有两端,各端可以通过账号密码、验证码、三方登录,但缺少扫码登录这一方式。
- 优势
- 扫码登录可以避免被攻击者肉眼看到或拍摄到,用手机App扫码提高了安全性。
- 各类应用需要设置密码的地方越来越多,密码设置的越来越复杂,输入的时候容易出错,而现在手机使用率很高,扫码登录提高了便捷性。
- 扫码登录的增加会使App的下载和活跃得到增长。
- 技术方案
扫码登录时序图如下:
- 用户在浏览器中输入网址;
- 服务器收到用户申请登录二维码的请求后,随机生成一个唯一标识符UUID,并将这个UUID当做一个键值对的Key存入后台Redis,同时设置一个过期时间,过期后用户登录二维码需要进行刷新重新获取。
- 服务器将这个key值和本公司的验证字符串合在一起,通过二维码生成接口生成一个二维码的图片,将二维码图片和UUID一起返回给用户浏览器;
- 浏览器拿到二维码和UUID后,会每隔一段时间向后台发送一次请求,请求中携带有UUID作为当前页面的标识符;
- 用户拿出手机用微信或其它三方应用扫码,应该提示下载该应用App(在生成二维码图片的时候做判断);
- 用户打开该应用App,需保持登录状态(有登录Token值),扫码后解析得到UUID值;
- App将Token+UUID一起作为参数向服务端发送验证登录请求;
- 服务器收到请求后,首先对比参数中的验证信息确定是否为合法,如果合法将这个用户的UUID-UserID作为键值对存入Redis;
- 二维码登录页不停的轮询是否登录成功,依据就是Redis中存在UUID-UserID键值对,如果存在,服务端生成该用户登录信息返回给Web前端,刷新显示登录页面。
- 关键点说明
二维码失效和轮询次数及时间的选择,以下各应用实践供参考
学习强国:75次、4s/次,5分钟后失效
京东:60次、3s/次,3分钟后失效
支付宝:130次、3s/次,6.5分钟后失效