SSO 是什么?

974 阅读4分钟

SSO(single side on 单点登录)的基本概念

  • 在一个系统中登录就可以在多个其他系统免登录的操作。为了合理利用资源和降低耦合性
  • 简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。
  • e.g: 比如阿里系的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。

SSO的体系结构

image.png

  1. 认证中心 (提供用户授权登录)
  2. 用户与账号系统,用户数据获取接口 (用户账号统一管理,提供用户数据的接口)
  3. 客户端模块(业务系统整合SSO的时候使用)
  4. 令牌(token)

SSO的认证流程

image.png

  1. 请求资源
  2. 令牌验证 -存在-验证有效——有效/无效—— 有效直接访问资源/无效再次认证获取新的token | 不存在 | 用户授权 资源访问
  • 大体分为4步骤
    • 判断token是否存在

    • 判断token是否有效

    • token认证

    • 生成token过程

  • 大体分为3个模块
    • SSOserver 认证中心
      1. 验证token有效性
      2. 提供登录页面, 授权成功生成token
      3. 提供注销,单点退出功能
    • SSOClient 客户端模块
      1. 拦截请求,提取令牌,交给认证中心验证
      2. 验证成功,获取资源信息
      3. 验证失败,将用户跳转到登录页面
    • SSO User & Manager 账户与账号管理系统
      1. 提供用户登录退出操作日志
      2. 提供用户信息查看,管理,统计功能
      3. 提供接口允许的业务系统同步用户信息
      4. 提供接口允许的特定业务系统新增与修改用户信息

CAS原理 (Central Authentication Service 中心授权服务)

说到单点登录,我们应该想到CAS, 其实单点登录用的就是这个逻辑。下面给大家讲一下什么是CAS。

  • 这里我们举例说明:
  1. 首先我们有个系统A:www.java1y.com 其中里面集成了认证服务
  2. 此时由于业务需要我们需要一个系统B:www.java2y.com
  3. 但是我们发现系统A,和B的登录逻辑其实是一样的数据库也一样,我们没必要同时维护两个系统做登录认证。
  4. 那我们就可以考虑将原来的系统A,B的登录逻辑抽离出来单独维护形成一个服务叫做 认证中心:www.sso.com ,加上剥离了登录认证服务的新的系统A:www.java3y.com 和系统B: www.java4y.com ,如下图所示:

image.png

  • 其实这时我们就拥有了一个CAS。那他的逻辑是这个样的:
  1. 首先用户想访问系统A: www.java3y.com 受限的资源(如购物车功能), 系统A,发现用户并没有登录,于是系统会重定向到SSO认证中心,并将自己的地址作为参数,请求地址如下:
    • www.sso.com?service=www.java3y.com SSO认证中心发现用户未登录,将用户引导至登录页面,然后用户进行登录验证,在验证通过时,用户与认证中心建立一个全局会话(生成一个token,写到Cookie中,保存在浏览器上)

image.png

认证成功后系统会重定向回到系统A, 并把token携带过去给A: - www.java3y.com?token=xxxxxxx

随后,系统A会带着获取到的token去认证中心验证是否正确,如果正确那么系统A和用户会建立局部会话(创建Session),到此,系统A和用户已经是登录状态了。

image.png

  1. 如果此时用户想要访问系统B: www.java4y.com 受限的资源(比如订单信息),系统B会先验证用户是否登录,如果发现用户没有登录,那么系统B会带着自己的地址重定向到认证中心如下:
    • www.sso.com?service=www.java4y.com 注意:其实这时系统B的请求是全程带着系统A中的cookie的,所以认证中心是可以通过cookie得知之前与系统A建立过会话,这时认证中心会带着token重定向回系统B:
    • www.java4.com?token=xxxxxxx 接着, 系统B去人中中心验证这个token是否有效,如果有效,系统B和用户建立局部会话(创建Session)。到此,系统B和用户已经是登录状态了。

image.png

跨域的SSO

  1. 解决方案:
    • jsonp
    • cors 有兼容问题,是浏览器通过判断返回头做区分的

跨域SSO原理:

  1. 流程图

image.png

  1. 跨域的Cookie读写
    • 通过请求调用服务器中的写Cookie的方法(jsonp script请求,或者用cors方法,或者用同域代理)

    • 有些浏览器是对第三方Cookie有第三放限定的,可以通过设置P3P来解除限制

      • P3P 是在返回头配置的(详细配置请自行BD)
    • 通过URL参数实现跨域信息传递