0%

如何实现扫码登陆

微信的扫码登陆风行,几乎所有的web端应用都给出了让用户从移动端扫码登入的入口;
本文主要描述如何用扫码形式在云端绑定硬件设备;

问题描述

  1. 有一台设备,通过序列号确保唯一;
  2. 设备需要从云端获取token(长期有效,可重置)后才能与云端通信;
  3. 如何让设备获取这个token?

常用方案

方案1(手动绑定)

  1. 用户登陆云端;
  2. 用户在云端输入序列号完成设备添加后,获得token;
  3. 在设备上手输token,完成云端接入;
  4. token变化后,设备需重新接入;

方案2(扫描绑定)

  1. 设备从服务端获取授权sessionId,并以二维码形式展示;
  2. 设备等待授权动作(60s超时);
  3. 用户登陆云端;
  4. 用户扫描设备二维码,完成绑定设备;
  5. 设备收到绑定信号,完成设备绑定;

方案比较

  1. 方案1的比较原始,设备情况比较复杂,输入困难,不适合手动操作;
  2. 方案2将复杂度交给服务端,用户体验上易于接受;

实现方案

业务流程

扫描绑定-时序图

要完成扫描绑定,服务端需要实现3个接口:

  1. 获取二维码接口;
  2. 等待二维码授权接口;
  3. 二维码授权接口;
    前2个接口成对使用,供应用入口调用;
    第3个接口给授权端使用;

技术方案

  1. 等待二维码授权的长连接,采用redis blocking queue实现(非轮询);
  2. 注意blpop会阻塞占用连接资源,在新的二维码生成时要主动释放;
  3. 每个接口的调用要注意防攻击,需对session规则校验,缓存命中校验;

思考

  1. 扫描授权本质上是一个以临时token换区长期token的技术方案;
  2. 授权终端一般是微信小程序或者手机App,比PC端更为安全;同时也降低PC端授权开发的复杂度;