好的,我们可以分析一下 来往网页版或微信网页版扫码自动登录 的原理。核心是“扫码 + 临时 token + 会话绑定”,背后涉及二维码生成、短时令牌、长轮询/WebSocket 与服务端认证。下面我给你详细拆解。
扫码自动登录原理分析
一、整体流程
- 网页生成二维码
- 用户访问网页版登录页面 → 前端请求服务器生成登录二维码。
- 二维码内容通常是 一次性登录标识(UUID 或 token)。
- 二维码显示在网页上,等待扫描。
- 用户用移动端扫描二维码
- 手机 App(已登录)扫描二维码。
- App 向服务端发送请求:告知该 UUID/token 对应的登录请求,并携带用户身份信息(通常是 JWT 或 session cookie)。
- 服务端验证并关联会话
- 服务端收到扫码请求后,校验二维码是否有效(未过期)。
- 将该 UUID/token 与手机用户身份绑定。
- 标记这个登录请求为“已认证”。
- 网页版轮询或 WebSocket 接收结果
- 网页端通过轮询接口(短轮询或长轮询)或 WebSocket 监听二维码状态。
- 一旦服务端标记 UUID/token 已认证,网页端获取用户身份信息或 token。
- 完成自动登录
- 网页端拿到用户身份信息 → 建立登录会话(如 session、JWT cookie)。
- 页面刷新或跳转到已登录状态。
二、技术细节
1. 二维码生成
- 二维码内容一般是 随机唯一 ID 或一次性 token:
uuid=123e4567-e89b-12d3-a456-426655440000 timestamp=1699999999
- 后端生成二维码时可以:
- 保存 UUID 与状态(未扫码 / 已扫码 / 已授权)在 Redis 或内存
- 设置有效期(如 1 分钟),防止滥用
2. 手机端扫码
- 手机端扫描二维码 → 提取 UUID → 调用登录授权接口:
POST /api/scan_qr { uuid: "123e4567-e89b-12d3-a456-426655440000", user_id: 88888, signature: "xxx" }
- 签名或 token用于校验请求来自合法用户,防止伪造请求。
3. 服务端绑定
- 后端保存 UUID 对应的用户信息:
UUID: 123e4567-e89b-12d3-a456-426655440000 status: authorized user_id: 88888
- 可选:生成临时登录 token,用于网页端会话创建。
4. 网页端轮询/WebSocket
- 轮询实现:
GET /api/qr_status?uuid=123e4567-e89b-12d3-a456-426655440000
- 返回状态:
pending
→ 未扫码scanned
→ 已扫码但未确认authorized
→ 扫码已授权 → 前端登录
- 返回状态:
- WebSocket 实现:
- 网页端建立 WebSocket 连接,服务端扫码事件触发推送。
5. 安全性
- UUID 或 token 短时有效(如 60-120 秒)
- 使用 HTTPS 防止中间人攻击
- 手机端扫码时需 登录状态验证,保证二维码无法被陌生人滥用
- 登录成功后,UUID/token 立即作废,防止重复登录
三、微信网页版与来往网页版原理一致
- 二维码生成 + 临时 token
- 手机端扫码授权
- 服务端状态更新
- 网页端轮询或 WebSocket 获取结果
区别可能在于:
- 微信使用了 长轮询 + 推送消息 或 WebSocket
- 来往网页版可能更多使用 短轮询
- 微信在安全性上增加了 设备绑定、滑动验证、防止截图重放 等机制
四、流程图(简化版)
网页端请求二维码 → 服务端生成UUID → 返回二维码 → 显示网页
手机端扫码二维码 → 发送UUID + 用户信息 → 服务端校验 → 标记授权
网页端轮询/WS → 获取UUID状态 → 授权成功 → 建立网页登录会话
💡 总结
- 核心思想:二维码 + 临时 token + 手机端授权 + 网页端会话绑定
- 核心安全点:
- UUID/token 短期有效
- 手机端必须登录验证
- HTTPS/签名防篡改
- 网页端通过轮询或 WebSocket 接收扫码结果,实现 扫码自动登录
发表回复