Skip to content

P10 让你设计一个扫码登录怎么实现? ​

面试题:网页端"扫码登录"是怎么实现的?让你设计你会怎么做?

整体流程 ​

text
① 网页请求二维码 → 生成唯一 loginToken(含过期时间)并展示
② 网页开始轮询(或 WebSocket 长连接)查询该 token 的扫码状态
③ 手机 App 扫描二维码 → 拿到 token → 显示"确认登录"
④ 用户点确认 → App 携带用户凭证请求确认接口 → 服务端把 token 与用户绑定
⑤ 网页轮询发现状态变成"已确认" → 用 token 换取登录凭证(session/token)
⑥ 登录成功,进入系统

关键设计点 ​

1. 二维码内容 ​

二维码里不要放用户信息,只放一个随机一次性 token(UUID 或加密串),防止扫码泄露数据。

2. 状态机 ​

text
待扫码(UNSCANNED)→ 已扫码待确认(SCANNED)→ 已确认(CONFIRMED)→ 已过期(EXPIRED)

网页端根据状态渲染对应 UI(二维码 / "请确认登录" / "登录成功")。

3. 状态查询方式 ​

  • 轮询:简单可靠,注意降频(如 1 秒一次)、超时停止;
  • WebSocket/SSE:服务端主动推送,实时性好,连接成本高;
  • 生产常用"轮询 + 状态缓存(Redis)"。

4. 状态存储 ​

用 Redis 存 login:{token} → {status, userId},设置过期时间(如 2 分钟),过期自动清理:

text
SET login:abc123 UNSCANNED EX 120

5. 安全 ​

  • token 一次性:确认后立即失效,防止重放;
  • 过期时间:二维码过期重新生成;
  • 确认接口要鉴权:只有已登录用户才能确认;
  • 加设备/风险校验:陌生设备扫码登录要二次验证或风控。

加分点 ​

  • 支持"已登录设备扫码后直接免确认"(信任设备);
  • 状态变更用 Redis 事务/Lua 保证原子性;
  • 并发确认:同一 token 只允许绑定一次(SETNX)。

一句话总结 ​

网页生成带 token 的二维码 → 手机扫码确认绑定用户 → 网页轮询状态换取登录凭证;核心是 token 生命周期状态机 + Redis 存储 + 过期/一次性安全策略。

基于 VitePress 重建