# 单点登录解决方案
## CAS
后端需要 session 保存登陆状态.
1. 单点登录
2. 单点登出
## JWT
1. 后端不需要session 保存登录状态, 可以有效避免前端跨域问题.
2. 后端需要保存登出状态.
1. 单点登录设计
参考, JWT 原理
2. 单点登出设计
简单来说就是需要使 token 失效.
适用场景:
1. 需要踢人
2. 用户点击单点登录
JWT 和网关进行组合使用
1. 首先用户登录 sso 账户系统, 获取一个access token 和一个 fresh token.
2. 用户访问其它系统, 先访问网关, 网关对 access token 进行解析, 解析成功的话放到头里面, 转发给对应的服务.
配合单点登出
第二步, 对JWT解析成功后, 改成还需要判断下爱用户是否需要被踢出. 也就是说token是否应该有效.
当其他应用需要踢出该用户, 或者是该用户登出了, 那么应用需要让网关知道该用户的token需要失效了, (这个通过直接发送MQ消息给网关或者是使用redis共享内存均可以).
内存分析
此时, 网关或者是redis内存, 只需要保存的是需要失效的token, 这个内存占用不会太大, 而且由于token是有过期时间的, 假如token失效时间设为1小时, 那么只需要内存中最多只需要保存这些数据一个小时就可以.
## 让token失效的解决方案
### 和网关共享失效的token设计
当应用需要让token失效的时候, 只需要发送信息给网关, 让网关在验证token的时候知道token已经失效了.
此时网关验证token的步骤有两步
1. 验证token本身是否有效.
2. 验证token是否被失效(验证token是否在失效列表里面)
共享信息方式
1. 应用发送token失效消息给网关, 由网关存放信息.
好处: 网关在获取信息的时候随时可用.
2. 使用共享内存, 如redis, 网