单点登录那些你迷糊的知识点

219 阅读5分钟

我们先看看普通网页登录的逻辑:

我们在浏览器(Browser)中访问一个应用,这个应用需要登录,我们填写完用户名和密码后,完成登录认证。这时,我们在这个用户的session中标记登录状态为yes(已登录),同时在浏览器(Browser)中写入Cookie,这个Cookie是这个用户的唯一标识。下次我们再访问这个应用的时候,请求中会带上这个Cookie,服务端会根据这个Cookie找到对应的session,通过session来判断这个用户是否登录。如果不做特殊配置,这个Cookie的名字叫做jsessionid,值在服务端(server)是唯一的。 这种登录方式有很多缺点比如在分布式系统如何做session共享等问题,这里我们不细说。

接下来看看单点登录的逻辑

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

接下来我们看看它的核心知识点以及实现它的逻辑,理解了逻辑剩下来都是代码实现了

image.png

简易的单点登录模型,我们接下来一一分析

先说一点,单点登录的前提是需要提供一个独立认证中心系统

1.访问系统A 先通知认证中心看是否登录若没有登录则跳转到认证中心提供的登录页面,登录后认证中心会提供一个cookie也就是token并且保存登录状态,然后跳转到原有的访问页面

2.系统A再次访问其请求时会携带token或者cookie先去访问认证中心监测是否登录若登录则放行访问

3.继登录系统A后再第一次访问B系统,那么B系统会携带系统A登陆后从认证中心拿到的cookie或者token去访问认证中心,认证中心通过所携带的cookie或者token去检测登录状态若已登录并且再有效登录时间内则会放行。

这就是单点登录的一整套逻辑,这里面有一个关键点,就是登录状态如何共享呢? 这里分为两种情况,同域和不同域,我们先来看同域

同域的情况下很好解决可以利用cookie也可利用sessionStorage或者localstorage 利用cookie的话需要这是cookie的domain将其设置为顶级域名即可实现cookie共享。 我们在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。比如:我们不能在自己的系统中给taobao.com的域设置Cookie。 若顶级域名情况下sessionStorage或者localstorage在domain2.com的页面中,我们可以嵌入一个src为domainA.com的iframe,此时这个iframe里可以调用domain1.com的localstorage。用postMessage方法实现页面与iframe之间的通信。 同时可以优化下iframe,我们可以在domainA.com中专门写一个负责共享localstorage或者sessionStroage的页面,这样可以防止无用的资源加载到iframe中

不同域名下那么cookie就无法共享这里可以通过cas来实现

dcb743204f8a201be53df5338fc34affe5fa1059.png

上图是CAS官网上的标准流程,具体流程如下:

  1. 用户访问app系统,app系统是需要登录的,但用户现在没有登录。
  2. 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。  SSO系统也没有登录,弹出用户登录页。
  3. 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
  4. SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
  5. app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
  6. 验证通过后,app系统将登录状态写入session并设置app域下的Cookie。

至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。 接下来,我们再看看访问app2系统时的流程。

  1. 用户访问app2系统,app2系统没有登录,跳转到SSO。
  2. 由于SSO已经登录了,不需要重新登录认证。
  3. SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
  4. app2拿到ST,后台访问SSO,验证ST是否有效。
  5. 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。

这里有个关键app2系统没有登录跳转到sso时sso系统凭什么认为app2为已登录呢,在app登录成功后认证系统会在浏览器中设置一个cookie,这个cookie只有在访问认证系统时才会携带,注意只要访问认证系统就会携带这个cookie,这是它的核心点

**单点登录的核心流程就是这样我们再来总结一下单点登录要做的事情吧! **

1.单点登录(SSO系统)是保障各业务系统的用户资源的安全 。

2.各个业务系统获得的信息是,这个用户能不能访问我的资源。

3.单点登录,资源都在各个业务系统这边,不在SSO那一方。 用户在给SSO服务器提供了用户名密码后,作为业务系统并不知道这件事。 SSO随便给业务系统一个ST,那么业务系统是不能确定这个ST是用户伪造的,还是真的有效,所以要拿着这个ST去SSO服务器再问一下,这个用户给我的ST是否有效,是有效的我才能让这个用户访问