扫码登陆实现思想

发布于 2023-10-19  771 次阅读


扫码登录的应用现已趋于普遍,许多PC端的网站和应用都纷纷采用这一便捷的登录方式。用户无需在网页上进行繁琐的账号密码输入,只需借助手机上的应用,如微信、支付宝、QQ等,利用其扫码功能,简单扫描网页上展示的二维码并确认登录,即可轻松完成网页端的登录流程。这种登录方式不仅大大简化了用户的操作步骤,还提高了登录过程的安全性,成为了现代网络应用中广受欢迎的登录方式之一,于是我对怎么实现扫码登陆背后的原理有点感兴趣。

三个关键参与者

在实现扫码登录的过程中,主要涉及到三个关键参与者:PC端、手机端以及服务端。

  • PC端:负责展示登录二维码,以及轮询服务端以获取登录状态的更新。
  • 手机端:负责扫描登录二维码,并向服务端发送登录确认请求。
  • 服务端:负责生成登录二维码、处理手机端的登录请求,以及通知PC端登录的状态。
    每个参与者都有各自明确的角色和职责,相关的设计和实现都需要围绕这三个参与者展开,以确保扫码登录的流畅和安全。

两个核心问题

在实现扫码登录时,主要面临两个核心问题:

  1. 手机端如何完成认证:在传统的账号密码登录方式中,用户在PC端输入账号和密码完成认证。但在扫码登录中,认证过程转移到了手机端,手机端需要通过扫描二维码并确认登录来完成认证过程。
  2. PC端如何完成登录:在账号密码登录中,PC端可以通过账号和密码直接从服务端获取认证凭据(如Token)。但在扫码登录中,由于认证过程在手机端完成,PC端需要通过某种机制来从服务端获取认证凭据。

解决方案
针对上述两个核心问题,可以设计以下解决方案:

  1. 手机端认证:用户通过手机端的应用扫描PC端展示的二维码,获取二维码中的数据。手机端将二维码数据和用户的登录凭据发送到服务端,请求登录。
  2. PC端完成登录:PC端通过轮询机制定期查询服务端,获取二维码的状态和登录凭据。一旦二维码状态为已成功,服务端返回PC端的登录凭据,PC端使用该凭据完成登录过程。

扫码登录功能的完整逻辑

网页端与服务器的配合逻辑:

初始化二维码生成过程:

  • 用户打开网站的登录页面,向服务器发送获取登录二维码的请求。
  • 服务器接收到请求后,生成一个唯一标识符(UUID),作为键(key)存储在Redis服务器中,并设置一个过期时间。
  • 服务器将该UUID和公司的验证字符串合并,通过二维码生成接口,生成二维码图片。
  • 二维码图片和UUID一同返回给用户的浏览器。
  • 登录状态查询:
  • 浏览器接收到二维码和UUID后,每隔一定时间(例如一秒),向服务器发送登录状态查询请求,请求中携带UUID作为当前页面的标识符。

    手机端与服务器的配合逻辑:

    扫描二维码并验证:

  • 用户通过手机扫描网页上展示的二维码,获取验证信息和UUID。
  • 手机端已登录,每次访问服务器时,参数中会携带用户的Token,服务器通过Token解析得到用户ID。
  • 手机端将解析得到的数据和用户Token一同作为参数,向服务器发送验证登录请求。
  • 服务器验证请求的合法性后,返回确认信息给手机端。
  • 手机端接收到确认信息后,展示登录确认框给用户。
  • 用户确认登录后,手机端再次发送确认登录请求,服务器接收到UUID和用户ID后,将用户ID作为值(value)存储在Redis中,以UUID作为键(key)。

    登录成功时的逻辑:

    登录状态的更新和确认:

  • 当浏览器再次发送登录状态查询请求时,服务器通过UUID在Redis中查找对应的用户ID。
  • 如果找到用户ID,服务器调用登录方法,生成浏览器端的Token。
  • 在浏览器再次发送请求时,服务器将用户信息和浏览器端的Token返回给浏览器,完成登录过程。


世界并不是非黑即白的。