单点登录是一次登录 ,可以访问多个应用 .在复杂的软件体系中 ,减少登录的操作时间 .
Cookie
登陆后 ,将登录成功的凭证(账号密码/Ticket/Token)放在Cookie(公共域名或者父域名下) .登录其他应用的时候带上这个Cookie ,其他应用只需要校验Cookie里的信息就可以判断是否登录 .
缺点 : 不能跨域(硬伤)/Cookie不安全(加密md5验证)
Cookie通过域名区分 ,浏览器只会传递Cookie给同一域名下的网页 .
通过Domain和Path细分 : 域名是倒叙 ,表示父子结构 ;Path表示主机上的访问路径 .
baidu.com 适用百度下所有子应用
baike.baidu.com 只适用百度百科
baike.baidu.com/link 只适用百科link路径下的请求但只是看起来安全 : 例如之前使用百度搜索关键字”word” ,到另一个嵌入了百度广告系统的网站B ,B里面的广告直接和”word”相关 .
使用百度搜索时 ,将关键字写入较高级别的Cookie ;因为广告系统同属Baidu ,进入网站B时加载广告系统 ,将Cookie带入 ,广告系统获取了搜索的关键字 ,自动推荐 .但实际上这是一种隐私暴露 .
JSONP
通过父应用进行登录 ,将登录凭证存放在父应用Session中 .登录子引用时 ,通过Cookie信息(只包含简单的用户名) ,调用父应用的验证接口 ,由父应用告诉是否已经登陆过 .避免Cookie的敏感信息存放本地的一些问题 .
缺点 : (已知加密算法时) 将子应用访问引到伪造的父应用(绑定本地host)上 / 伪造响应请求给子引用直接登录 / 一定程度上的跨域(需要共享父应用的Cookie)
重定向
设置一个单独的登录系统SSOSite ,访问网站A的请求(请求参数中包含请求路径)都被重定向到SSOSite ,进行登陆后创建Cookie ,并重定向到目标网站A .再次访问B时 ,也重定向到SSOSite ,此时已有Cookie(SSO的) ,返回并重定向到B .
参考 SSO单点登录三种情况的实现方式详解 最后一种
单点登录理解并不困难 ,主要在于解决 跨域和安全性 上需要诸多考虑 .