1.什么是SSO?什么是单点登录
1.1.session存了什么?
1.2.浏览器同源策略
1.3.session共享与session复制(不可用方案)
1.4 session复制到session不复制|
1.5.跨域访问
2.SpringSession+redis
3. token(一串字符串)
3.1 token包含什么?
3.2 token怎么获得?
4.JWT
4.1JWT是什么
4.2JWT组成
4.3JWT实现
4.3.1 main() createToken
4.3.2 创建出来的内容
4.3.3 Base64 压缩与解压缩而非加密
4.3.4 加密 头信息的结果
4.3.5 下发的token到底是什么?
1.什么是SSO?什么是单点登录
SSO是为了解决一个用户在鉴权服务器登陆过一次后,可以在任何应用中畅通无阻,一次登陆,多系统访问。
1.1.session存了什么?
每台机器 用户信息+浏览器 访问到A,A产生了一个session 里面存的是什么?数据+用户的sid(唯一标识)
1.2.浏览器同源策略
A域名的存的A的,B域名存的是B的。
1.3.session共享与session复制(不可用方案)
在A中创建了sidA,在B中创建了sidB,如果我想只创建一个session用于访问AB, 可否实现?可以。 用容器创建session。那么你在A登陆用的id可以用于登陆B的。
seesion 是不变的吗?不是。 A中的更改是可以同步到B中的。
1.4 session复制到session不复制|
A,B,C这少,如果多了呢?同步到集群。如果不想这么传来传去怎么办? 每台机器都不存, 容器创建session放入第三方的一个东东里,比如redis.
1.5.跨域访问
sidA+cookieA带到B中即可。那么怎么实现?
2.SpringSession+redis
先来个手动搬运版本的实现。 springSession+redis 选中:redis+session+web 。
1.新建一个project
2.新建一个controller
MainController{}
6.seesion共享是至少2个服务,此时我再起一个。 server.port=8081
7.用两个不同的浏览器 localhost:8080 localhost:8081 此时都可以用用户名:123;密码:123登陆。
我把8080的session值复制到8081上。 这样就不需要登陆,直接出结果值。
3. token(一串字符串)
3.1 token包含什么?
服务器端:字符串+加密(秘钥)
客户端:id->db->返回一个字符串
sha1(123)=123131摘要
4.JWT
4.1JWT是什么
JSON Web Token。是一种基于JSON的令牌安全验证(在某些特定场合可以替代Session或者Cookie),一次生成随处校验 。
4.2JWT组成
三部分: Header、Payload、Signature三部分拼成一个字符串,每个部分之间用(.)分隔。
1.Header 头部 { "alg":"HS256",//签名算法 "typ":"JWT" //token类型 }
2.playload { "exp"(expiration time): //过期时间 "sub"(subject): //出题,用户id "iat"(Issued At): // 签发时间 }
3.HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret) header.payload.signature
4.3JWT实现
4.3.1 main() createToken
//subject id
//issueDate
public static string createToken(string subject,Date issueDate)
{
Calendar c=Calendar.getInstance();
c.setTime(issueDate);
c.add(Calendar.DAY_OF_MONTH,20);//过期时间+20 天
string compactJws=Jwts.builder()
.setSubject(subject)
.setIssueAt(issueDate) //下发时间或者叫创建时间
.setExpiration(c.getTime())//过期时间
.signWith(io.jsonwebtoken.SignatureAlgorithm.HS512,secret)//加密算法
.compact();
return compactJws;
}
public void main(String[] args)
{
//1.校验账号密码
//2.获取账号数据 账号数据写入subject里
string reateToken=createToken("userid=1,username=xiaoxiao,age=18",new Date());
println(token);
}
4.3.2 创建出来的内容
摘要=头+体 目的是为了防止数据被篡改。此处为base64的压缩,不是加密。
4.3.3 Base64 压缩与解压缩而非加密
byte[] decode=Base64.getDecoder().decode("");//此处放入信息
System.out.println(new string(decode));
1.加密算法:HS512: 前面创建的时候 ,signWith(io.jsonwebtoken.SignatureAlgorithm.HS512,secret)
2:加密字符串:secret ,存于服务器端,自己写的。
4.3.5 下发的token到底是什么?
客户端->服务器 token是什么?
服务器->客户端 token 是什么?
下发的是: hash=hash(头+体+secret(只有服务器自己知道))
服务器校验的:hash 值 得到hash可以做鉴权。