什么是单点登录
在多个应用系统中,用户只需要登录一次,即可访问所有相互信任的应用系统.
前提概念
1. http无状态协议
web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与前后的请求产生关联,下图说明,三次请求/响应对之间没有任何联系,都是平行线。(浏览器发送了三次请求)
但这也同时意味着,任何用户都能通过浏览器无差别访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;那就必须鉴别浏览器请求,响应合法请求,忽略非法请求;要鉴别浏览器请求,必须清楚浏览器请求状态。既然http协议无状态,那就需要客户端和服务端共同维护一个状态标识,用来区分鉴别客户端是否安全合法,这个机制就是会话机制。
2. 会话机制
浏览器第一次请求服务器,服务器创建一个会话,并将会话的id作为响应的一部分发送给浏览器,浏览器后续的每次请求都会带上会话id,通过这个标识服务器鉴别了是否为同一个用户。
通过cookie的方式登录
将会话id作为每一次请求的参数,服务器接收请求自然能够解析参数获得会话id,并借此判断是否来自同一会话,cookie机制正好用来做这件事,cookie是浏览器用来储存少量数据的一种机制,数据以“key/value”形式储存,浏览器发送http请求的时候自动附带cookie信息。如图是通过JESSIONID来作为会话id.
3. 解决多系统的登录情况
当面临多系统登录的情况下,由于cookie是有跨域限制的,无法在不同域名下建立连接。 在解决方案的过渡期,有人提出将web应用群中所有子系统的域名统一在一个顶级域名下,例如"*.baidu.com",然后将他们的cookie设置为'baidu.com',这种做法理论上是可行的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。 但是这种方案有很多局限性,首先应用群域名得统一;其次应用群各系统使用的技术要相同,不然cookie的key值不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间,第三,cookie本身不安全。 因此,单点登录这就粉墨登场啦。
单点登录原理
sso需要一个独立的认证中心,只有认证中心才能接受处理用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。
间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。
这个过程,也就是单点登录的原理,用下图说明
- 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数;
- sso认证中心判断用户是否登录,将页面跳转到登录页面(带系统1地址);
- 用户输入用户名密码提交登录申请;
sso认证中心校验用户信息,验证成功后就创建全局的会话(意思是将cookie信息保存到sso认证中心当中),并创建令牌;- sso认证中心返回令牌给到系统1,跳转到之前携带的系统1地址当中;
- 系统1发送校验请求,携带系统1的地址去到sso中心校验令牌;
- sso认证中心发现令牌有效后注册了系统1的地址,并告诉系统1令牌有效;
系统1使用该令牌创建与用户的会话,称为局部会话(seesion),返回受保护资源;- 用户访问系统2的受保护资源;
- 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址和之前的sso认证中心的会话cookie信息作为参数;
- sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌;
- 系统2拿到令牌后去sso认证中心看看自己的令牌是不是个大宝贝;
- sso认证中心校验令牌,发现有效,就注册了系统2,并告诉系统2他的登录信息有效,是个大宝贝;
- 系统2使用该令牌创建与用户的局部会话,返回受保护的资源。
用户登录成功之后,会与sso认证中心及访问的子系统建立会话,用户与sso认证中心建立的会话称为全局会话,用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过sso认证中心,全局会话与局部会话有如下约束关系
-
局部会话存在,全局会话一定存在;
-
全局会话存在,局部会话不一定存在;
-
全局会话销毁,局部会话必须销毁.
注销
在一个子系统中注销,所有子系统的会话都将被销毁。
下面对上图简要说明
-
用户向系统1发起注销请求
-
系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求
-
sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
-
sso认证中心向所有注册系统发起注销请求
-
各注册系统接收sso认证中心的注销请求,销毁局部会话
-
sso认证中心引导用户至登录页面
设计单点登录方案
参考文章: 单点登录的简单实现
前端侧主要的实现是:
- 拦截子系统未登录用户请求,跳转至sso认证中心
- 接收并存储sso认证中心发送的令牌
- 与sso-server通信,校验令牌的有效性
- 建立局部会话
- 拦截用户注销请求,向sso认证中心发送注销请求
- 接收sso认证中心发出的注销请求,销毁局部会话