SpringBoot实现扫码登录
一、概述
1、扫码登录介绍
二维码登录本质上也是一种登录认证方式。既然是登录认证,要做的也就两件事情:告诉系统我是谁,以及向系统证明我是谁。
比如账号密码登录,账号就是告诉系统我是谁, 密码就是向系统证明我是谁; 比如手机验证码登录,手机号就是告诉系统我是谁,验证码就是向系统证明我是谁;
2、扫码登录原理
- PC 端发送 “扫码登录” 请求,服务端生成二维码 id,并存储二维码的过期时间、状态等信息
- PC 端获取二维码并显示
- PC 端开始轮询检查二维码的状态,二维码最初为 "待扫描"状态
- 手机端扫描二维码,获取二维码 id
- 手机端向服务端发送 “扫码” 请求,请求中携带二维码 id、手机端 token 以及设备信息
- 服务端验证手机端用户的合法性,验证通过后将二维码状态置为 “待确认”,并将用户信息与二维码关联在一起,之后为手机端生成一个一次性 token,该 token 用作确认登录的凭证
- PC 端轮询时检测到二维码状态为 “待确认”
- 手机端向服务端发送 “确认登录” 请求,请求中携带着二维码 id、一次性 token 以及设备信息
- 服务端验证一次性 token,验证通过后将二维码状态置为 “已确认”,并为 PC 端生成 PC 端 token
- PC 端轮询时检测到二维码状态为 “已确认”,并获取到了 PC 端 token,之后 PC 端不再轮询
- PC 端通过 PC 端 token 访问服务端
二、扫码登录实战(轮询版)
1、环境准备
- SpringBoot
- Lombok
- Redis
2、RedisTemplate序列化
1 | //序列化RedisTemplate |
3、Token工具类
1 | /** |
4、定义扫码状态
1 | public enum CodeStatus { |
5、定义返回类
1 |
|
6、定义二维码工具类
1 | /** |
7、编写相应方法
1 | 4j |
三、扫码登录(长连接版)
当然不仅仅包括短轮训,还有SSE(Server-Send Events,可以用WebFlux实现)以及WebSocket长连接实现,可以参考:Spring Boot + Web Socket 实现扫码登录
参考文章: