微信的扫码登陆风行,几乎所有的web端应用都给出了让用户从移动端扫码登入的入口;
本文主要描述如何用扫码形式在云端绑定硬件设备;
问题描述
- 有一台设备,通过序列号确保唯一;
- 设备需要从云端获取token(长期有效,可重置)后才能与云端通信;
- 如何让设备获取这个token?
常用方案
方案1(手动绑定)
- 用户登陆云端;
- 用户在云端输入序列号完成设备添加后,获得token;
- 在设备上手输token,完成云端接入;
- token变化后,设备需重新接入;
方案2(扫描绑定)
- 设备从服务端获取授权sessionId,并以二维码形式展示;
- 设备等待授权动作(60s超时);
- 用户登陆云端;
- 用户扫描设备二维码,完成绑定设备;
- 设备收到绑定信号,完成设备绑定;
方案比较
- 方案1的比较原始,设备情况比较复杂,输入困难,不适合手动操作;
- 方案2将复杂度交给服务端,用户体验上易于接受;
实现方案
业务流程
要完成扫描绑定,服务端需要实现3个接口:
- 获取二维码接口;
- 等待二维码授权接口;
- 二维码授权接口;
前2个接口成对使用,供应用入口调用;
第3个接口给授权端使用;
技术方案
- 等待二维码授权的长连接,采用
redis blocking queue
实现(非轮询); - 注意blpop会阻塞占用连接资源,在新的二维码生成时要主动释放;
- 每个接口的调用要注意防攻击,需对session规则校验,缓存命中校验;
思考
- 扫描授权本质上是一个
以临时token换区长期token
的技术方案; - 授权终端一般是微信小程序或者手机App,比PC端更为安全;同时也降低PC端授权开发的复杂度;