Q:什么是单点登陆
在多系统应用群众登陆一个系统,便可在其他所有系统中得到授权而无需再次登陆,包括单点登陆和单点注销两部分。即一家企业下的服务只要一次注册,登录的时候只要一次登录,退出的时候只要一次退出。
Q:为什么需要单点登陆
在企业级应用中,存在多个子系统,难道要一个一个登陆、认证、注销?Web系统由单系统发展成多系统组成的应用群,对用户而言,是一个统一的整体,因此用户访问整个应用群,只需要一次登陆注册即可。
单点登陆原理.png
Q:单点登陆如何实现
实现单点登陆主要是解决以下问题:
- 如何产生和存储信任
- 其他系统如何验证这个信任的有效性
实现方案:通过父子应用来回重定向进行通信,实现信息的安全传递。
- 父应用提供一个GET方式的登陆接口如
https://passport.58corp.com/login
- 子应用
http://fecar.58corp.com
通过重定向的方式访问这个接口https://passport.58corp.com/login?service=http%3A%2F%2Ffecar.58corp.com%2F
- 如果用户没有登陆,返回一个登陆页面;如果用户已经登陆了,则生成加密的Token,重新进行登陆验证,验证通过进入子应用。
SSO提供一个认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登陆入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。
会话机制
浏览器第一次请求服务器,服务器创建一个会话,并将会话的id作为响应的一部分发送给浏览器,浏览器存储会话id,并在后续第二次和第三次请求中带上会话id,服务器取得请求中的会话id就知道是不是同一个用户了,后续请求与第一次请求产生了关联。
tomcat会话机制当然也实现了cookie,访问tomcat服务器时,浏览器中可以看到一个名为“JSESSIONID”的cookie,这就是tomcat会话机制维护的会话id。
同理访问Express服务器时,浏览器中也可以看到一个cookie。
如下所示。
Express会话id
在使用Express时候,会设置session中间件,secret对session id相关的cookie进行签名;name是session id的名字,即cookie键名,默认为sid。
session中间件.png
Cookie
- Cookie不能跨域。
- 通过加密Cookie可以保证安全性,前提是源码不泄露。如果Cookie的加密算法泄露,攻击者通过伪造Cookie可以伪造特定用户身份。
- 浏览器发送http请求时会自动携带与该域匹配的cookie信息。