什么是单点登录
只需要登录一次就可以访问所有的子系统。
基于Session实现单点的登录
- Session的特性:
- 储存JSESSIONID在客户端
- 相同的域能够读取到数据
- 服务端保持Session会话
- 理论基础
通过子系统使用相同的域来实现:- A、B、C三个系统
- A的域名为 a.bb.com
- B的域名为 b.bb.com
- C的域名为 c.bb.com
- 那么将Cookie的域设置为 bb.com 。在访问A、B、C任何一个系统的时候都会带Cookie过去
- 具体实现
- 由于时间原因而且这种按照理论基础来实现没有太大的障碍。提一点在登录的时候最好加上?form=xxxx 进行登录成功后的跳转。
基于jwt实现单点登录
-
什么是jwt:json 格式的数据,组成的web端,使用的令牌。
- jwt由三段 json格式 数据组成:header、payload、singnature
- header:标头,该 json字段 包含{typ:“JWT”,alg:“HS256”}。定义令牌类型和加密算法
- payload:负载,该 json字段 包含自定义到客户端的数据。
- singnature:签名,用于防止令牌被篡改。不是json字段。是标头和负载各自的base64编码后加上服务器端才知道的盐值,经过标头定义的加密算法加密出来的值构成
- 如何拼接
- Base64(标头).Base64(负载).签名
- jwt由三段 json格式 数据组成:header、payload、singnature
-
jwt如何实现登录验证
- 用户登录成功后,根据上面的三段拼接出jwt,返回给客户端存储。
- 用户访问需要授权的资源时,需要带上jwt。服务器进行下面的验证
-
通过 . 分割客户端传的jwt
-
Base64解码(第一部分),获取标头部分。拿到加密算法
-
将第一部分+第二部分+服务器生成jwt时使用的盐值,根据上面获取到的加密算法得出singnature部分。和分割的第三部分对比。判断jwt是否有效
-
若有效,且使用了jwt框架或自己在负载加上了过期时间,则判断jwt是否过期
-
若没过期,就可以Bas
-