作者:l佳恒_756 | 来源:互联网 | 2023-09-07 20:44
Token(令牌)token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。单点登录原理:当用户第一次登录后,服务器生成一个token并将此token返回
Token(令牌)
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
单点登录原理:
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,客户端收到token后把它存储起来,可以放在COOKIE或者Local Storage(本地存储)里。 以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
同域SSO原理分析
实际上,HTTP协议是无状态的,单个系统的会话由服务端Session进行维持,Session保持会话的原理是通过COOKIE把sessionId写入浏览器,每次访问都会自动携带全部Cookie,在服务端读取其中的sessionId进行验证实现会话保持。同域下单点登录其实就是手写token代替sessionId进行会话认证。
token的生成
token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)
服务端生成token后,将token与user对象存储在Map结构中,token为Key,user对象为value,response.addCOOKIE()生成新的Cookie,名为token,值为token的值。
跨域SSO原理分析
当有多个系统时,认证机制的流程如下:
- 提供用户登录界面,供用户进行身份认证
- 用户验证通过后,生成新token
- 将token<->user 对存入全局MAP中供校验
- 将token写入所有域的COOKIE中
- 页面重定向回原始请求URL
分析
当系统有多个并且在不同域(domain)时,COOKIE只会作用在当前域下。
将token写入所有域的COOKIE中才是解决跨域SSO的核心。
COOKIE增删改查
如何读取COOKIE?
通过Servlet中的request对象可以读取到COOKIE数组,然后foreach遍历读取,一般只是获取到nam和value,其他信息写入到浏览器后,浏览器不主动再发回来,读取并无意义。
COOKIE[] COOKIEs = request.getCOOKIEs();
if (COOKIEs != null) {
for (COOKIE COOKIE : COOKIEs) {
System.out.println(
COOKIE.getName() +
COOKIE.getValue() +
COOKIE.getMaxAge() +
COOKIE.getPath() +
COOKIE.getDomain() +
COOKIE.getSecure() +
COOKIE.isHttpOnly()//客户端js是否可以获取
);
}
}
如何写入COOKIE带到浏览器?
新建COOKIE对象设置一系列属性,然后添加到response中去。需要注意的是,当设置path为“/”时,表示所有路径都会被该COOKIE作用到,如果设置为/path1
那么由/path2
发起请求就不会携带该COOKIE。默认不设置只作用在当前路径下。
COOKIE COOKIE = new COOKIE("myCOOKIEName","myCOOKIEValue");
COOKIE.setHttpOnly(false);//Javascript不能处理
//一个正值表示COOKIE将在经过许多秒之后过期。注意,值是COOKIE过期的最大时间,而不是COOKIE当前的时间。
//负值表示COOKIE没有持久存储,在Web浏览器退出时将被删除。零值会导致删除COOKIE。
COOKIE.setMaxAge(-1000);
COOKIE.setSecure(false);//如果为true,仅支持HTTPS协议
//COOKIE对指定目录中的所有页面以及该目录子目录中的所有页面都可见。
COOKIE.setPath("/");
//COOKIE.setDomain("www.a.com");//默认情况下,COOKIE只返回给发送COOKIE的服务器。
response.addCOOKIE(COOKIE);
修改COOKIE
修改更新COOKIE时,除了要保证COOKIE的name是相同的,也要保证COOKIE的一系列属性是相同的,否则浏览器会生成新的COOKIE。
删除COOKIE
只需要设置COOKIE的MaxAge为负值,意味着是过去的COOKIE,浏览器就会清除。
参考文献---掘金
SSO单点登录原理与技术