简介
同一产品具有移动端App和PC端应用,为方便用户在PC端登录,在PC端提供一个登录二维码,使用移动端App扫码并确认登录,然后在PC端登录成功
时序图
流程
PC端发起扫码登录
PC端请求后端获取二维码
后端根据一些信息(ID)生成二维码,返回二维码图片数据和二维码ID
- 返回二维码二进制流,通过自定义请求头返回二维码ID(需配置
Access-Control-Expose-Headers
),前端直接通过blob显示二维码图片 - 返回二维码ID和二维码静态目录地址,前端再通过地址请求二维码图片
或仅返回二维码ID,由前端生成二维码图片
- 返回二维码二进制流,通过自定义请求头返回二维码ID(需配置
后端保存二维码ID并维护其扫码状态
已过期
对二维码设置过期时间,前端轮询到二维码状态已过期则再次请求后端获取二维码
未扫码
生成新的二维码默认为”未扫码”状态,仅在该状态下允许APP的登录请求(只能使用一次,防止重放攻击)
接收到APP的登录请求后,先验证该二维码状态是否为”未扫码”,如果是则改为”扫码中”,如果不是则返回错误
已扫码待确认
已确认
PC端轮询扫码状态
- PC端请求后端获取扫码状态(通过二维码ID)
用户APP扫码确认登录
APP端是登录状态
- 用App自带的扫码功能,扫描浏览器中的二维码,提取二维码中的登录信息(ID)
- APP将二维码信息(ID)和当前用户的token一起提交给后端,发起登录请求
- 后端确认用户token有效后
- 将ID和token(用户信息)关联起来
- 修改二维码状态为”已扫码待确认”
- 生成临时 token并返回
- 将ID和临时token关联起来
- APP显示登录确认页面,这个页面可以是App的Native页面,也可以是远程H5页面
- 用户点击确认或者同意按钮后,App携带临时token发起确认登录请求
PC端登录成功
- 后端确认临时token有效后
- 修改二维码状态为”已确认”
- 根据ID获取用户信息,生成新的PC端token
- 查询状态接口返回已确认状态和PC端token