在构建现代分布式应用时,身份认证与授权是两个核心且常被混淆的概念。今天,我们就来理清两个关键的技术方案:SSO(单点登录)和 OAuth2.0。它们都使用令牌(Token)来替代传统的用户名密码访问应用,流程上颇为相似,但设计目标和应用场景却有着本质区别。
一、核心概念概述
SSO,即 Single Sign On,旨在解决用户需要在多个互相信任的系统间重复登录的痛点。它的核心思想是将登录认证与具体的业务系统分离,建立一个独立的认证中心。用户在认证中心完成一次登录后,便可无需再次认证,直接访问所有相关联的业务系统资源。
OAuth2.0,即 Open Authorization 2.0,其首要目标是解决授权问题。它允许用户授权一个第三方应用(Client)去访问该用户在另一个服务提供商(Resource Server)上存储的受保护资源,而无需将用户的凭据(如密码)暴露给第三方应用。我们常见的“使用微信登录某网站”便是OAuth2.0的典型应用。
尽管两者都涉及令牌和跳转,但SSO更关注认证的统一性(“我是谁”在多个地方都有效),而OAuth2.0更关注授权的安全性(“我允许某个应用访问我的特定资源”)。
二、SSO:单点登录的实现思想
为了理解OAuth2.0,我们先深入看一下SSO的流程。SSO是一种架构思想,而CAS(Central Authentication Service)是实现这种思想的一种流行框架。下图清晰地展示了基于CAS的浏览器单点登录序列流程:

整个流程可以概括为以下几个关键步骤:
- 首次访问受保护应用:用户访问业务系统A(Protected App),系统发现用户未登录,将浏览器重定向至SSO认证中心(CAS Server),并附上自己的地址作为
service参数。
- 认证中心检查:CAS Server检查用户是否有全局的SSO会话。若无,则向用户展示登录表单。请注意,这个登录表单是由CAS提供的,只有CAS中心保存了用户的密码,业务系统不接触密码。
- 用户认证:用户提交用户名密码到CAS Server进行认证。成功后,CAS Server会创建全局SSO会话,生成一个代表此次会话的票根——票据授予票据(Ticket Granting Ticket, TGT),并通过Cookie(如
CASTGC)下发到浏览器。
- 颁发服务票据:CAS Server将浏览器重定向回业务系统A,并在URL中携带一个一次性的服务票据(Service Ticket, ST)。
- 后端验证:业务系统A的后端接收到ST,会向CAS Server的验证接口发起一个后端请求(非浏览器跳转),验证此ST的有效性。验证通过后,CAS返回用户标识信息。
- 建立局部会话:业务系统A根据用户信息,建立自身的局部会话(如设置Session ID),并返回给浏览器。至此,用户登录业务系统A成功。
- 访问其他受信任应用:当用户接着访问同体系的业务系统B时,浏览器会携带CAS下发的TGT Cookie访问CAS。CAS发现已有有效SSO会话,便直接颁发针对B的新ST,用户无需再次输入密码即可登录B。
一个常见的例子就是淘宝生态:登录淘宝APP后,点击首页的天猫、饿了么等链接,都能直接跳转访问,无需二次登录。

SSO的成功实施,关键在于构建一个可信的单点登录系统,这套系统通常需要与公司的组织架构和账号体系深度集成,更多属于企业内部网络/系统安全的范畴。
三、OAuth2.0:专注于授权的开放协议
OAuth2.0的流程与SSO有相似之处,但角色和目的不同。在典型的OAuth2.0授权码模式中,主要包含以下角色:
- 资源所有者 (Resource Owner):即用户本人。
- 客户端 (Client):想要访问用户资源的第三方应用(如“某网站”)。
- 授权服务器 (Authorization Server):负责认证用户并颁发令牌的服务器(如微信、GitHub的登录授权服务器)。
- 资源服务器 (Resource Server):存放用户受保护资源的服务器(如微信的用户信息接口、GitHub的API)。授权服务器和资源服务器可以是同一台,也可以是分离的。
当我们用OAuth2.0来实现类似SSO的效果时(即“社交登录”),通常不严格区分资源服务器,客户端获取到访问令牌(Access Token)后,直接向授权服务器请求用户基本信息即可。
其简化流程如下:

- 用户在第三方应用点击“微信登录”。
- 应用将用户重定向至微信授权服务器,并携带自己的身份标识和回调地址。
- 微信授权服务器向用户展示授权页面(询问“某应用想获取你的头像和昵称,是否同意?”)。
- 用户同意授权,微信服务器将浏览器重定向回第三方应用的回调地址,并附上一个授权码(Authorization Code)。
- 第三方应用的后端使用授权码、自己的应用密钥等信息,向微信服务器发起请求,换取访问令牌(Access Token)。
- 第三方应用使用Access Token调用微信的API,获取用户的头像、昵称等信息,并以此在自己的系统内为用户创建账号或建立会话。
OAuth2.0的四种授权模式:
- 授权码模式 (authorization code):最常用、最安全,适用于有后端的Web应用。令牌存储在后端,避免泄漏。
- 隐藏式模式 (implicit):适用于纯前端SPA应用。令牌直接通过前端重定向颁发,安全性较低。
- 密码模式 (password):要求用户高度信任客户端,直接将用户名密码交给客户端。仅适用于官方第一方应用。
- 客户端凭证模式 (client credentials):适用于机器与机器之间的认证(M2M),没有用户参与。
四、关键名词辨析与总结
最后,我们梳理一下这几个经常一同出现的名词之间的关系:
- SSO:是一种思想或解决方案,目标是“一次登录,到处访问”。它是抽象的,CAS等框架是它的具体实现。
- OAuth2.0:是一个开放的授权协议标准。它生来并非为了做SSO,但它“用户授权第三方应用获取资源”的能力,恰好可以被我们利用来实现跨域的“社交登录”式单点登录。在这个过程中,用户信息就是被保护的资源。
- JWT (JSON Web Token):是一种令牌的具体格式标准。它常被用作OAuth2.0中颁发的Access Token的载体,因其自身可以包含信息且可验证。
- Spring Security / Apache Shiro:是用于实现访问控制的安全框架。它们处理的是“认证通过后,用户有什么权限(角色)能访问哪些API或页面”。在基于OAuth2.0实现的SSO系统中,客户端在获取用户信息后,仍需依靠这类Java框架来实现本系统内部的权限管理。它们是实现后端 & 架构中安全层的重要工具。
简单来说: 你可以使用OAuth2.0协议来实现一种特定形式的SSO(尤其是跨企业的社交登录),而在此之上,你的每个具体应用内部,可能还需要Spring Security这类框架来管理更细粒度的访问权限。理解它们的本质区别和适用场景,对于设计清晰、安全的系统认证授权体系至关重要。在云栈社区的讨论中,我们也常常看到开发者对这些概念的深度探讨和实战分享。
|