首页/文章/javascript

简化访问:深入理解SSO单点登录

2024-07-31
23358 分钟
...

概念

单点登录SSO(Single Sign On)是一种身份验证和授权机制,它允许用户只需登录一次,就能够访问多个相关但独立的系统或应用。

这种机制通过在用户登录时颁发令牌的方式实现,令牌包含有关用户身份和权限的信息,服务提供者可以通过验证这个令牌来确认用户的身份,而无需用户提供额外的凭证。

SSO的主要优点包括:

  1. 用户友好性:用户只需登录一次,即可访问多个应用程序,提供了更好的用户体验和便利性。
  2. 提高安全性:通过集中的身份验证,可以减少密码泄露和密码管理问题。此外,SSO还可以与其他身份验证机制(如多因素身份验证)结合使用,提供更强的安全性。
  3. 简化管理:SSO可以减少管理员的工作量,因为他们不需要为每个应用程序单独管理用户凭据和权限。

CAS认证授权机制

CAS (Central Authentication Service)是实现单点登录的一个标准化的过程,主要用于实现多个应用系统的统一身份验证。其核心思想是: 用户只需要在一个中央认证服务器上进行一次登录操作,即可获得访问所有已集成 CAS 的受保护资源的权限,无需在每个应用系统中单独登录。CAS 通过票据(Service Ticket(ST))的方式来管理用户的会话和认证状态。

CAS单点登录流程:

  1. 用户访问受保护资源:用户尝试访问一个受保护的资源,例如一个Web应用程序。
  2. 重定向到CAS服务器:如果用户未登录或未携带有效的登录凭证(如票据),应用程序将重定向用户到CAS服务器的登录页面。
  3. 用户登录:用户在CAS服务器的登录页面输入其凭据(通常是用户名和密码)。
  4. CAS服务器验证CAS服务器接收用户的凭据,并进行验证。如果凭据有效,CAS服务器将生成一个Service Ticket(ST)
  5. 发放Service TicketCAS服务器Service Ticket发送给用户。这个票据是一个随机生成的字符串,用于请求访问特定服务。
  6. 用户携带Service Ticket返回:用户携带Service Ticket返回到原始应用程序。
  7. 应用程序验证Service Ticket:应用程序接收Service Ticket,并将其发送到CAS服务器验证票据的有效性
  8. CAS服务器响应验证结果:如果Service Ticket有效,CAS服务器确认票据有效,并向应用程序提供用户的身份信息。
  9. 用户被授予访问权限:应用程序接收到CAS服务器的确认后,将允许用户访问请求的资源。
  10. 用户访问其他服务:用户在访问其他服务时,将重复步骤2至9,使用新的Service Ticket进行认证。
  11. 单点登出(可选操作) :如果CAS服务器支持单点登出,用户可以从任何服务发起登出请求,CAS服务器将使所有有效的Service Ticket失效,实现用户在所有服务中的登出。

单点登录技术实现

流程:

  1. 去往认证中心登录,输入账号密码进行登录
  2. 登录验证成功之后,在session表格中记录一条身份信息(sessionId(sid)身份信息(唯一id、账号等)的键值对)
  3. 记录之后,通过响应中的Set-Cookie头部将其发送给浏览器,浏览器则将sid保存在Cookie
  4. 之后访问子系统时,浏览器携带已有的sidCookie 到认证中心,认证中心去查session表格可有登录信息,查到就说明已经登录
  5. 告诉子系统用户登录
  6. 子系统访问受保护资源

只要这个session表格中有这条记录,就说明这个用户是登录成功的,没有则未登录,或者是过期

优点

  • 认证中心具有强控制力,拥有对用户的绝对控制:假如有用户进行了违规操作,直接处理session表格即可让其下线。

缺点

  • 成本高:网站用户量大,导致认证中心压力大,各种子系统都要发sid过来,session表格变得很大,可能需要session集群
  • 风险高:认证中心挂掉则所有系统都挂掉,可能还需要进行容灾

token模式

token模式是一种分布式的模式,子系统自己认证:

优点

  • 压力小:如果子系统用户量变大,几乎和认证中心无关。

缺点

  • 控制力弱:如果token时间过长,认证中心失去了对子系统的控制,无法指定用户下线。
  • 用户体验:如果token时间过短,需要频繁登录,影响用户体验。

token + refreshToken模式

  • 用户在认证中心登录后会颁发两个token:

    • 一个是所有子系统都能认识token(过期时间非常短,比如十几二十分钟)
    • 一个是只有认证中心才认识refreshToken(过期时间长,比如一周一个月)
  • 用户请求时带的是短的token,当这个token过期后,用户使用refreshToken向认证中心获取新的token,刷新token没有问题就颁发一个新的token给子系统

过一段时间需要进入一次认证中心,便于控制。

URL重定向传播会话

上面我们介绍了CAS认证的方式,在传统的CAS单点登录实现中,主要使用的是票据(Ticket)机制,而不是令牌(Token)机制。有一种常见的SSO实现技术,它并不依赖于特定的认证协议或机制比如CAS,但是大致流程如出一辙,就是使用 URL 重定向传播会话实现单点登录

这是一种通用的 SSO 实现策略,可以与不同的认证协议(如 CAS、OAuth2 + OIDC)结合使用,并不局限于某一种特定的技术或机制。

在这种实现中,当用户首次访问应用时,如果发现用户未登录,应用会重定向用户到认证中心服务器。用户在认证中心上登录后,服务器通过 URL 重定向将用户带回到原始应用,并附带一些认证信息(如授权码或ticket票据,票据有效时长很短)。

URL 重定向传播会话实现单点登录流程:

  1. 用户访问子系统,检查登录状况。

  2. 若未登录,用户跳转到子系统登录页面/sso/login,并携带back参数 记录初始页面URL。

    • 形如:http://{sso-client}/sso/login?back=xxx
  3. 子系统尚未登录,再次将其重定向至SSO认证中心,并携带redirect参数记录子系统的登录页URL。

    • 形如:http://{sso-server}/sso/auth?redirect=xxx?back=xxx
  4. 用户进入了 SSO认证中心 的登录页面,开始登录。

  5. 用户 输入账号密码 并 登录成功,SSO认证中心再次将用户重定向至子系统的登录接口/sso/login,并携带ticket码参数。

    • 形如:http://{sso-client}/sso/login?back=xxx&ticket=xxxxxxxxx
  6. 子系统根据 ticket码 请求接口,从服务端获取账号id,并在子系统进行登录。

  7. 子系统将用户再次重定向至最初始的 back 页面。

整个过程在第一次登录时,第四步需要手动执行登录,其他步骤全部自动化,之后访问其他子系统时,由于认证中心已登录,则整个过程全部自动化。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
javascript2025-09-18
JavaScript 的多线程能力:Worker
如果你写过一些计算量稍大的 JavaScript 代码,比如图像处理、大量数据排序或者复杂的算法,你几乎肯定遇到过浏览器“卡死”的现象。点击页面没反应,动画也停了,就像整个世界都静止了。 这就是主线程被阻塞的典型后果。因为主线程既要负责执行 JavaScript,又要负责渲染页面、响应用户操作,一旦它被繁重的计算任务占满,就无暇顾及其他,用户体验便直线下降。 这个问题的根源,正是“主线程是单线程的”。那么,如何解决呢? 答案很简单:把这...
学习面试
javascript2025-09-10
手把手教你实现一个EventEmitter
你是不是也遇到过这种情况:代码里各种事件监听和触发,回调函数套了一层又一层,最后自己都理不清哪个事件先触发、哪个后触发了? 别担心,今天我就带你从零开始实现一个自己的事件触发器(EventEmitter),让你彻底掌握事件驱动的精髓,代码清晰度直接提升200%! 为什么要懂EventEmitter? 先说说为什么我们要关心这个。Node.js的核心就是事件驱动,比如文件读写、网络请求,都是通过事件来处理的。不会EventEmitter,...
学习面试
javascript2025-08-09
Web Worker 多线程魔法
你是否曾遇到过网页因为复杂计算而卡顿的情况?今天,让我们一起探索Web Worker的神奇世界,看看如何用多线程技术解决性能瓶颈,并实现流畅的图片压缩功能! 为什么需要Web Worker? 想象一下,你在一个繁忙的餐厅里,只有一位服务员(主线程)负责点餐、上菜、结账所有工作。当客人突然暴增时,这位服务员就会手忙脚乱,其他客人只能干等着… 这就是JavaScript的现状—— 单线程 !所有任务都在一个线程中排队执行,一旦遇到复杂计算(...
学习面试
javascript2025-08-07
🌐AST抽象语法树
AST 是前端开发中一个非常重要的概念,它就像是代码的“编译器”,能够帮助我们理解和操作代码。本文将深入探讨 AST 的原理和应用,带你从零开始了解 AST。 一、什么是 AST? AST(抽象语法树)是一种树形结构,用于表示程序代码的语法结构。它将代码分解为一系列的节点,每个节点代表代码中的一个元素,如变量、函数、表达式等。AST 是编译器和解释器的基础,也是代码分析和转换的关键工具。 1\. AST 的结构 AST 的结构通常包括以...
学习面试
javascript2025-08-05
打字机效果是如何实现的
分析效果 使用 AI 对话的时候,文字是一个字一个字蹦出来的?它不是等所有内容生成完毕后一次性展示,而是以一种流畅、实时的“打字机”效果呈现,这种体验的背后,隐藏着一种高效的Web技术。它就是 服务器推送事件(Server Sent Events,简称 SSE) 什么是 SSE 从根本上说,SSE 是一种允许服务器 单向 、 持续 地向客户端(浏览器)推送数据的Web技术。 可以把它想象成一个 电台广播 : 服务器 是广播电台,持续不断...
学习面试
javascript2025-08-04
Promise 从原理到实现
前言 是 异步编程的核心概念之一,它为我们提供了一种更优雅的方式来处理异步操作。 本文将全面剖析 的工作原理,并逐步实现一个符合 规范的 。 正文 一、Promise 基础概念 代表一个异步操作的最终完成(或失败)及其结果值。它有 种状态: 1. pending : ,既不是成功,也不是失败状态 2. fulfilled :意味着操作 完成 3. rejected :意味着操作 状态一旦改变就不能再变,只能从 变为 ,或从 变为 。 二...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录