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 1205. 安全
- token 一次性:确认后立即失效,防止重放;
- 过期时间:二维码过期重新生成;
- 确认接口要鉴权:只有已登录用户才能确认;
- 加设备/风险校验:陌生设备扫码登录要二次验证或风控。
加分点
- 支持"已登录设备扫码后直接免确认"(信任设备);
- 状态变更用 Redis 事务/Lua 保证原子性;
- 并发确认:同一 token 只允许绑定一次(SETNX)。
一句话总结
网页生成带 token 的二维码 → 手机扫码确认绑定用户 → 网页轮询状态换取登录凭证;核心是 token 生命周期状态机 + Redis 存储 + 过期/一次性安全策略。