CAS和OAuth
CAS(Central Authentication Service)和 OAuth(Open Authorization)都是处理身份验证和授权的协议/框架,但它们核心目标、设计原理和应用场景有显著区别,也存在一定的联系。以下详细说明:
核心区别总结:
| 特性 | CAS (Central Authentication Service) | OAuth (Open Authorization) |
|---|---|---|
| 核心目标 | 单点登录 (SSO) | 授权委派 (Authorization Delegation) |
| 主要功能 | 集中验证用户身份,提供跨应用访问凭证。 | 允许第三方应用在用户同意下访问用户在资源服务器的受限资源。 |
| 信任关系 | 应用信任认证中心。 | 用户信任认证服务器授权第三方应用访问资源。 |
| 关键票据 | TGT (Ticket Granting Ticket), ST (Service Ticket) | Access Token (访问令牌), Refresh Token (刷新令牌) |
| 用户身份 | 直接向应用提供用户身份信息。 | 不直接向第三方应用暴露用户身份(只提供访问权限)。 |
| 典型场景 | 企业内部系统SSO、校园网系统登录。 | 社交媒体登录、API访问授权、应用间数据共享。 |
| 协议层 | 认证协议。 | 授权框架。 |
详细解析:
核心目标与功能:
- CAS:
- 目标: 实现单点登录 (SSO)。用户只需在一个地方(CAS Server)登录一次,即可访问所有信任该 CAS Server 的后端集成应用 (CAS Clients),无需在每个应用重复输入用户名密码。
- 功能: 核心是集中式身份认证。它验证用户的凭据(如用户名密码),生成代表该用户会话的票据(TGT),并为用户请求访问的每个具体应用生成一次性服务票据(ST)。应用使用 ST 向 CAS Server 验证该票据的有效性并获取用户的身份标识(通常是用户名)。
- OAuth:
- 目标: 实现授权委派。允许用户授权第三方应用 (Client Application) 代表自己访问存储在资源服务器 (Resource Server) 上的特定资源(如 Google Drive 文件、Facebook 个人资料),而无需将用户在资源服务器上的主凭证(用户名密码)直接交给第三方应用。
- 功能: 核心是颁发访问令牌 (Access Token)。OAuth 定义了资源所有者(用户)、客户端(第三方应用)、授权服务器和资源服务器之间的交互流程,最终使客户端获得一个访问令牌。客户端使用此令牌向资源服务器请求受保护的资源。OAuth 本身并不定义用户身份认证,尽管它常与 OpenID Connect 结合使用来实现认证。
- CAS:
关键概念与流程:
- CAS (简化流程):
- 用户访问 App A (Protected Service)。
- App A 重定向用户到 CAS Server (Login URL)。
- 用户在 CAS Server 登录(输入用户名密码)。
- CAS Server 验证凭据,创建 TGT(存储于服务器端),设置 Cookie(通常是
TGC),生成针对 App A 的 ST。 - CAS Server 重定向用户回 App A(携带 ST)。
- App A 使用 ST 向 CAS Server 的
/validate或/serviceValidate端点验证 ST。 - CAS Server 验证 ST 有效,返回用户的身份标识(XML 格式)。
- App A 建立用户本地会话,允许访问。
- 用户访问 App B(也集成 CAS)。
- App B 重定向用户到 CAS Server(携带 Service URL)。
- CAS Server(用户有 TGC Cookie)发现用户已登录,生成针对 App B 的 ST。
- CAS Server 重定向用户回 App B(携带 ST)。
- App B 验证 ST,获取用户身份,建立会话。SSO 完成。
- OAuth 2.0 (授权码流程 - 最常见):
- 用户尝试在 Client App 中使用其 Resource Server 账户(如“用 Google 登录”)。
- Client App 重定向用户到 Authorization Server (AS)。
- 用户在 AS 登录(认证发生在此,但 OAuth 本身不定义如何认证)。
- AS 要求用户授权 Client App 访问请求的范围(Scope,如
read profile,write files)。 - 用户同意授权。
- AS 重定向用户回 Client App(携带一个授权码 (Authorization Code))。
- Client App(在后端)使用授权码 + 自己的 Client ID/Secret 向 AS 的
/token端点请求。 - AS 验证授权码和客户端凭证,颁发 访问令牌 (Access Token) 和可选的刷新令牌 (Refresh Token)。
- Client App 使用 Access Token 访问 Resource Server 的 API(如获取用户资料)。
- Resource Server 验证 Access Token(通常通过内省或 JWKS),如果有效则返回请求的资源。
- CAS (简化流程):
信任模型:
- CAS: 基于应用对认证中心的信任。所有 CAS Clients 都信任 CAS Server 对用户身份的断言。CAS Client 拿到 ST 后直接向 CAS Server 验证并获取明确的用户身份信息。
- OAuth: 基于用户对授权服务器和资源服务器的信任,以及资源服务器对授权服务器颁发的令牌的信任。第三方应用 (Client) 只获得一个代表授权范围的 Access Token,通常不直接知道用户的原始身份(除非通过 API 如
/userinfo获取,这依赖于资源服务器提供此类 API 和 scope)。资源服务器信任授权服务器签发的有效令牌。
用户身份信息:
- CAS: 核心是传输用户身份。CAS Server 在验证 ST 后,会明确地将用户的标识符(通常是用户名)返回给 CAS Client。这是 SSO 的关键。
- OAuth: 核心是传输访问权限 (Token)。Access Token 代表的是访问特定资源的权限,不必然包含或直接暴露用户的原始身份标识给 Client。Client 知道它有权访问某些资源,但资源与哪个具体用户的关联是由 Resource Server 在验证 Token 时确定的。要获取用户身份,Client 通常需要额外调用一个 API(如 OpenID Connect 的
/userinfo)。
典型应用场景:
- CAS:
- 企业内部多个系统(邮箱、HR 系统、报销系统)的 SSO。
- 大学校园网系统(选课系统、图书馆系统、成绩查询)的统一登录。
- 任何需要用户一次登录即可访问多个后端集成 Web 应用的场景。
- OAuth:
- “使用 Google/Facebook/Twitter/微信 登录” 第三方网站或 App。
- 允许第三方 App(如邮件客户端)访问用户在 Gmail/Yahoo Mail 中的邮件。
- 允许数据分析工具访问用户在云存储(如 Dropbox)中的特定文件。
- 微服务架构中服务间的 API 授权。
- 移动 App 访问后端 API。
- CAS:
联系与结合:
不是互斥,可结合使用:
- 一个系统可以同时实现 CAS 和 OAuth。例如:
- 使用 CAS 作为内部员工访问所有企业应用的 SSO 解决方案。
- 使用 OAuth 来授权外部合作伙伴应用访问企业 API 或特定资源。
- CAS Server 可以充当 OAuth 的 Authorization Server。现代 CAS 实现(如 Apereo CAS)通常内置了 OAuth 2.0 / OpenID Connect 支持。这样,同一个认证中心既能处理内部应用的 SSO(通过 CAS 协议),也能处理对外部应用或 API 的授权(通过 OAuth 2.0 协议)。
- OAuth 可用于实现某种形式的 SSO (Social Login SSO): 当多个网站都使用同一个 OAuth Provider(如 Google)登录时,用户如果在 Google 是登录状态,通常只需授权一次(或之前已授权)即可快速登录这些网站。但这本质上是利用了 OAuth Provider 的会话(其自身的登录状态),是 OAuth 流程的副产品,而不是像 CAS 那样有明确的票据流转和验证机制在多个后端集成应用间同步登录状态。CAS 的 SSO 通常更严格和可控(尤其是注销时)。
- 一个系统可以同时实现 CAS 和 OAuth。例如:
OpenID Connect (OIDC) - OAuth 的认证扩展:
- OIDC 在 OAuth 2.0 基础上添加了身份认证层。它定义了标准的
/userinfo端点,Client 可以使用 Access Token 获取经过认证的用户身份信息(Claims)。 - 这使得 OAuth (with OIDC) 不仅能做授权,也能做认证,并且是实现“社交登录”类 SSO 的标准方式。 在这个场景下,OAuth/OIDC Provider 的功能与 CAS Server 在认证方面有重叠。但核心区别仍在:OIDC 仍是基于令牌和 API 调用的授权框架扩展,而 CAS 是专门为应用间 SSO 设计的基于票据的协议。
- OIDC 在 OAuth 2.0 基础上添加了身份认证层。它定义了标准的
总结:
- CAS 是专为 SSO 设计的协议。 它解决的核心问题是“一次登录,处处通行”(在信任圈内)。它明确地在认证中心和应用间传递用户身份。
- OAuth 是专为授权委派设计的框架。 它解决的核心问题是“让第三方应用代表我安全地访问我拥有的资源,而无需交出我的密码”。它传递的是访问资源的令牌,而非直接的用户身份(OIDC 弥补了这点)。
- 选择:
- 需要为多个后端集成应用提供严格、可控的SSO?CAS 是经典且强大的选择。
- 需要实现“用 XX 登录”、允许第三方应用访问用户在你服务器上的资源、或者进行API 访问授权?OAuth 2.0 (通常结合 OIDC) 是标准解决方案。
- 大型组织可能需要两者:CAS 处理内部员工 SSO,OAuth/OIDC 处理外部应用集成和 API 访问控制。现代认证服务器(如 Keycloak, Okta, Auth0, Apereo CAS)通常同时支持这两种协议。
理解它们的本质差异(SSO vs 授权委派)和核心流程(票据 vs 令牌)是正确应用它们的关键。虽然 OAuth/OIDC 在“社交登录”场景下提供了类似 SSO 的用户体验,但其底层机制和目标与传统的 CAS SSO 有根本不同。