24-登录功能功能架构设计十(扫码登录)
xiangliheart
xiangliheart
发布于 2022-04-30 / 16 阅读 / 0 评论 / 0 点赞

24-登录功能功能架构设计十(扫码登录)

用户扫码登录设计

扫码登录是在手机普及之后才推出的一种安全又便捷的登录方式,前提是扫码应用(手机App)与需要扫码登录的系统必须使用同一

套用户体系。所以,使用微信扫码登录第三方网站本质上是借助了OAuth 2.0协议中的授权码模式。第三方网站其实借用了微信的用户信息,与自己的用户信息进行了绑定。那么,如果不使用微信而使用自己的App是如何完成扫码登录的呢?

扫码登录流程如图4-50所示,总体分为以下3个步骤。

(1)      浏览器展示登录二维码,并提示用户使用指定App进行扫码登录。

(2)      用户使用指定App扫描浏览器中的二维码。

(3)      浏览器跳转到登录成功页面(大多数跳转到系统首页)。

图4-50 扫码登录流程

扫码登录是由多个系统协作完成的,包括浏览器、二维码服务、App、App后端服务和网站系统服务。扫码登录实现流程如图4-51所示。

(1)     第1.1步:打开系统的二维码登录页面,调用网站系统服务去获取二维码。

(2)     第1.2步:网站系统服务先生成唯一的业务流水号,并保存在数据库中,同时记录登录状态为未登录。

(3)     第1.3步:网站系统服务去请求二维码服务,并携带业务流水号、登录地址信息等。二维码服务接收到请求后生成二维码的唯一标识,并生成含有指定授权登录的URL信息的二维码图片。

例如,http://www.yinhongliang.com/auth?

qcode=1wdi03020134&busid=a23axd4,其中qcode为二维码的唯一标识,busid为业务流水号。

(4)     第1.4步:二维码服务将qcode和Base64图片返回给网站系统服务。

(5)     第1.5步:网站系统服务记录qcode,并与busid形成一对一的绑定关系。

(6)     第1.6~1.8步:浏览器页面再使用qcode不断地去轮询二维码服务,查询当前二维码的状态是什么。如果状态为已扫描,则页面显示二维码已扫描;如果状态为已失效,则页面提示二维码已失效,如图4-52所示。

(7)     第2.1~2.7步:用户使用指定的App扫描浏览器上的二维码,手机识别出二维码中的URL信息,然后跳转到指定的授权页面。此时

App异步通知二维码服务,此二维码已经被正确扫描并识别。二维码服务收到通知后,将二维码的状态更新为使用中的状态。因此,当浏览器页面再次轮询状态时,二维码就会显示为“二维码已扫描,请在手机上完成操作”,如图4-52所示。

图4-51 扫码登录实现流程

图4-52 二维码的状态变化

如果此时用户已经登录过App,则直接提示用户是否授权登录××系统,如图4-53所示。

如果此时用户并没有登录过App,则先要求用户录入用户名和密码完成登录流程,再做授权,如图4-54所示。

图4-53 已登录状态下的App授权

图4-54 未登录状态下的App授权

用户完成App端授权后,会通知到App后端服务,授权通过。

(8)     第3.1~3.4步:App后端服务接收到用户同意授权的通知后,会携带当前用户的唯一标识、二维码的唯一标识qcode、业务流水号 busid,再去通知网站系统服务。首先网站系统服务要完成该用户的登录动作,生成对应的Session 或Token信息;然后更新对应业务流水号的状态为登录成功;最后携带二维码的唯一标识qcode去通知二维码服务,将二维码的状态更新为已使用状态。此时浏览器再刷新二维码的状态,则将显示为“此二维码已经使用”。

(9)     第4.1~4.3步:浏览器使用业务流水号busid去轮询网站系统服务,查询登录状态,如果状态为登录成功,则直接跳转到用户首页,完成整个扫码登录流程。

二维码服务的数据存储结构主要如表4-14所示。

表4-14 二维码信息存储结构

业务系统服务的数据存储结构主要如表4-15所示。

表4-15 二维码登录信息存储结构

一个看似简单的扫码登录,其实还是具有一定复杂性的,尤其是浏览器存在对二维码的状态轮询,以及对业务流水号的状态轮询两个动作,会造成请求十分频繁,因此一定要尽量降低二维码的有效时长,一旦二维码失效就立即停止轮询,等待用户刷新二维码再继续。如果把二维码的有效时长设置为1小时,则用户只要停留在该页面上,就会持续地进行轮询,耗费服务器资源。

更好的一种方式是将轮询机制更换为通知机制。例如,使用

WebSocket技术,在二维码的状态发生变化或登录的状态发生变化时,由网站系统服务主动通知浏览器,从而完成二维码展示的更新,以及系统首页的自动跳转。


评论