一个基于Redis的扫码登录方案+实现思路

路漫漫其修远兮,吾将上下而求索。 【写在前面】 互联网从诞生之初,欲要增加用户和网站的交互,则创建了用户系统。从最初的不验证用户账号密码的阶段,慢慢的将用户账号密码作为验证的依据。在此阶段,用户名从最初的字母,到邮箱,再到后来的手机号(国内)。随着第三方社交网站的崛起,使用第三方用户多的社交网站登录慢慢成了新的潮流,这种登录方式的优势体现在省去了复杂的注册过程,是绝大多数用户愿意选择的登陆方法之一。但是随着移动设备的发展,手机上使用最原始的账号+密码的第三方登录便显得很多余。同时也很麻烦,随着二维码的普及,手机第三方社交平台的扫码登陆的优势就凸显了出来。这无疑是目前最简单的用户登录方式了。   【本文的方案】本次依托unicloud部分功能,虽然依托unicloud的部分功能,但是主体流程具有普适性。具体实现方式如下:用户访问登录页面,向后端请求创建随机登录二维码,后端返回随机二维码(其实返回一个随机的uuid即可,二维码的生成在前端即可完成,分担后端压力)同时将uuid与状态码存储在redis内,设置一个超时时间(如2min),用户持已登录设备扫描二维码,用户手机进入二维码页面,向redis发送一个匹配key的状态码,更新二维码为已扫描,用户的登录页面有登录与取消按钮,点击登录随机将用户ID发送至redis,同时将用户的token存储在redis,PC页面轮询后端状态查询端口,后端通过redis内状态码,确定是否同意登录。如果用户扫码后取消登录,则在redis删除该记录即可。流程图如下

由于前端获取后端内容,在没有保持长连接的情况下,依旧采用的是长轮询,通过一遍遍不断地获取后端数据,在图中并未提现。   伪代码实现 【实现效果】 [caption id=”attachment_1103” align=”aligncenter” width=”894”] 用户打开登录页面[/caption]   [caption id=”attachment_1104” align=”aligncenter” width=”732”] Redis内已添加相应记录[/caption]   [caption id=”attachment_1106” align=”aligncenter” width=”285”]用户扫码 用户扫码[/caption]   [caption id=”attachment_1105” align=”aligncenter” width=”776”]扫码后Redis内对应UUID的state已修改 扫码后Redis内对应UUID的state已修改[/caption] [caption id=”attachment_1107” align=”aligncenter” width=”773”]点击登录后 点击登录后前端轮询到state为1表示已扫码[/caption] [caption id=”attachment_1108” align=”aligncenter” width=”690”]用户同意后更新Redis内容 用户同意后更新Redis内容[/caption]   至此扫码登陆结束,您可能会有如下问题: 1,为什么要用Redis? 一方面得益于Redis快速读写的特点,另外一方面时没有必要将这种压力传递给数据库,并且UUID在业务的角度,持久化存储在数据库的意义并不大 2,你的扫码登录用在哪个方面? 小程序采内扫码,可以将绑定的微信用户信息同步在目标网站。相当于跳过微信的扫码登录,这是最重要的优势。 3,如何保证不会出现数据交叉? 首先,用户访问登录界面会给后端发送生成UUID的请求,UUID可以最大程度保证不会出现重复,因此用户扫描后在当前时间空间下将用户和UUID视作为一个整体。所以不存在数据交叉的情况。 4,还有改进的方面吗? 首先应该限制某IP访问生成端口的频率,如果设置redis内对象的过期时间为2min,那么频率也应该设置为2min(或者一分种)。其次,还应该设置一个UUID过期的状态码,当Redis内取不到对应的数据时,状态码为-1. 5,……   【总结】以上只是一种最简单的方式实现扫码登陆,或许有更方便安全的方式存在,如果您有任何建议和意见希望在评论区留言。 祝愿本次空难所有罹难同胞长眠安息   ——Wicos 2022/03/29凌晨


一个基于Redis的扫码登录方案+实现思路
https://www.wicos.me/jishu/1099/
作者
Wicos
发布于
2022年3月28日
许可协议