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

路漫漫其修远兮,吾将上下而求索。

【写在前面】

互联网从诞生之初,欲要增加用户和网站的交互,则创建了用户系统。从最初的不验证用户账号密码的阶段,慢慢的将用户账号密码作为验证的依据。在此阶段,用户名从最初的字母,到邮箱,再到后来的手机号(国内)。随着第三方社交网站的崛起,使用第三方用户多的社交网站登录慢慢成了新的潮流,这种登录方式的优势体现在省去了复杂的注册过程,是绝大多数用户愿意选择的登陆方法之一。但是随着移动设备的发展,手机上使用最原始的账号+密码的第三方登录便显得很多余。同时也很麻烦,随着二维码的普及,手机第三方社交平台的扫码登陆的优势就凸显了出来。这无疑是目前最简单的用户登录方式了。

 

【本文的方案】本次依托unicloud部分功能,虽然依托unicloud的部分功能,但是主体流程具有普适性。具体实现方式如下:用户访问登录页面,向后端请求创建随机登录二维码,后端返回随机二维码(其实返回一个随机的uuid即可,二维码的生成在前端即可完成,分担后端压力)同时将uuid与状态码存储在redis内,设置一个超时时间(如2min),用户持已登录设备扫描二维码,用户手机进入二维码页面,向redis发送一个匹配key的状态码,更新二维码为已扫描,用户的登录页面有登录与取消按钮,点击登录随机将用户ID发送至redis,同时将用户的token存储在redis,PC页面轮询后端状态查询端口,后端通过redis内状态码,确定是否同意登录。如果用户扫码后取消登录,则在redis删除该记录即可。流程图如下

由于前端获取后端内容,在没有保持长连接的情况下,依旧采用的是长轮询,通过一遍遍不断地获取后端数据,在图中并未提现。

 

伪代码实现

【实现效果】

用户打开登录页面

 

Redis内已添加相应记录

 

用户扫码

用户扫码

 

扫码后Redis内对应UUID的state已修改

扫码后Redis内对应UUID的state已修改

点击登录后

点击登录后前端轮询到state为1表示已扫码

用户同意后更新Redis内容

用户同意后更新Redis内容

 

至此扫码登陆结束,您可能会有如下问题:

1,为什么要用Redis?

一方面得益于Redis快速读写的特点,另外一方面时没有必要将这种压力传递给数据库,并且UUID在业务的角度,持久化存储在数据库的意义并不大

2,你的扫码登录用在哪个方面?

小程序采内扫码,可以将绑定的微信用户信息同步在目标网站。相当于跳过微信的扫码登录,这是最重要的优势。

3,如何保证不会出现数据交叉?

首先,用户访问登录界面会给后端发送生成UUID的请求,UUID可以最大程度保证不会出现重复,因此用户扫描后在当前时间空间下将用户和UUID视作为一个整体。所以不存在数据交叉的情况。

4,还有改进的方面吗?

首先应该限制某IP访问生成端口的频率,如果设置redis内对象的过期时间为2min,那么频率也应该设置为2min(或者一分种)。其次,还应该设置一个UUID过期的状态码,当Redis内取不到对应的数据时,状态码为-1.

5,……

 

【总结】以上只是一种最简单的方式实现扫码登陆,或许有更方便安全的方式存在,如果您有任何建议和意见希望在评论区留言。

祝愿本次空难所有罹难同胞长眠安息

 

——Wicos 2022/03/29凌晨

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇