SSO单点登录原理与技术

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原理分析

当有多个系统时,认证机制的流程如下:

  1. 提供用户登录界面,供用户进行身份认证
  2. 用户验证通过后,生成新token
  3. 将token<->user 对存入全局MAP中供校验
  4. 将token写入所有域的Cookie中
  5. 页面重定向回原始请求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,浏览器就会清除。





参考文献---掘金

猜你喜欢

转载自www.cnblogs.com/JonaLin/p/12746176.html