面试知识库
进阶

扫码登录设计#

一句话答案#

PC 生成唯一 code 展示二维码→手机扫码发送 code+token→用户确认→服务端标记→PC 长轮询获取登录态。

核心要点

流程:

  1. PC 请求生成唯一 code → 展示二维码
  2. 手机扫码 → 发送 code + 已登录 token 到服务端
  3. 用户手机确认 → 服务端标记 code 已确认
  4. PC 长轮询/WebSocket → 获取登录 token

状态: 未扫描 → 已扫描待确认 → 已确认 → 已过期

面试回答(2分钟版)

扫码登录的核心流程分四步。第一步,PC 端向服务端请求生成一个唯一的 code,然后把这个 code 编码成二维码展示在页面上,同时开始长轮询或 WebSocket 监听状态变化。第二步,用户用已登录的手机 App 扫描二维码,手机端拿到 code 后连同自己的登录 token 一起发送给服务端,服务端校验 token 有效后把 code 的状态改为”已扫描待确认”。第三步,用户在手机上点击确认按钮,服务端将 code 状态改为”已确认”,并关联上用户身份。第四步,PC 端的长轮询感知到状态变为已确认,服务端给 PC 端颁发登录 token,完成登录。安全方面要注意:二维码里只包含 code 不包含任何密码信息,安全性完全依赖手机端已登录的 token 来背书;另外 code 要设置过期时间,通常两分钟,防止被截获后重放。

追问与易错

追问方向:

  • “二维码过期怎么处理?”→ code 在 Redis 中设 TTL(通常 2-3 分钟),过期后 PC 端轮询返回”已过期”状态,前端自动刷新生成新二维码
  • “不确认怎么办?”→ 用户扫码但不点确认,code 停留在”已扫描待确认”状态直到 TTL 过期自动失效;PC 端展示”等待确认”状态,过期后提示重新扫码
  • “安全问题?”→ 主要防 CSRF 和中间人:code 绑定 PC 端 session 防止跨站伪造,确认时展示 PC 端设备信息让用户核实,全链路 HTTPS 防窃听,code 一次性使用确认后立即失效

易错点:

  • ❌ 二维码包含账号密码——只包含唯一 code
  • ❌ 忽略中间人攻击