Skip to content

oAuth

介绍:

Open Authorization 是现代 web 鉴权体系的核心之一,它是一种鉴权体系而不是认证体系,目的是让一个应用在不拿到用户账户密码的情况下,访问用户在另一个平台上的受保护资源。

比如在登录某网站时选择“用微信登录”:

  • 网站想获取你的微信昵称、头像;
  • 微信(资源提供方)不会把你的密码给网站;
  • 微信让你授权:“是否允许该网站访问你的公开信息?”;
  • 你点“允许”,微信给网站一个临时的 令牌(token)
  • 网站就能用这个 token 去访问你的部分信息。

这整个过程就是 OAuth 在工作。

四个角色

  • 资源所有者(Resource Owner):用户,拥有资源所有权。

  • 应用程序(Client):准备访问用户资源的第三方应用。

  • 授权服务器(Authorization Server):专门负责授权的,比如微信的授权服务器,用于验证身份并发放令牌。

  • 资源服务器(Resource Server):存储受保护资源的,只接受携带有效令牌的资源访问。

授权流程:

以当前 OAuth 2.0 中应用最广泛的授权码模式为例:

  1. 用户访问第三方网站,选择用 github 账号登录;
  2. 网站跳转到 GitHub 登录页面,GitHub 询问用户是否同意授权;
  3. 用户点击“同意”,GitHub 重定向回网站,并附带一个 授权码code
  4. 网站后端拿着 code 去 GitHub 授权服务器换取 access_token
  5. 后端用这个 token 去访问 GitHub API 获取用户信息
  6. 网站拿到数据后创建本地账号、登录完成。

🔑 核心在于:

  • 网站永远拿不到用户密码
  • 用户可以随时在 GitHub 里撤销授权。

oAuth 和 JWT 有啥关系❓

角色:

  • OAuth 负责“授权”,规范授权流程和规则
  • JWT 负责“携带和验证身份信息”,是令牌内容的具体形态和验证方式。

背景:

  • 传统的 session 模式,服务端要维护一个数据库存储用户登录会话信息,每次请求都要查库查表成本高
  • JWT 是面向分布式的,因为他自己就包含了当前会话的权限、过期时间、用户ID等信息,只要服务端有密钥就能进行验证,具备 无状态验证跨服务可用携带基本信息防篡改的特点。

所以现代基本这种微服务、分布式架构下,大部分都用JWT去做。

oAuth 和 单点登录 有啥关系❓

OAuth(开放授权)和单点登录(SSO, Single Sign-On)确实关系密切但不等价

一、OAuth 是一种授权协议

OAuth(Open Authorization) 是一种标准协议,用于:

“让第三方应用在不获取用户密码的情况下,访问用户在另一服务上的资源”。

核心

  • OAuth 解决的是 “资源访问授权” 问题。

  • 用户仍然在 Google 登录;Google 授权后返回一个访问令牌(Access Token)给知乎。

  • 知乎使用这个令牌访问 Google 的用户信息接口(通常是 /userinfo)。


二、单点登录(SSO)是一种登录机制

单点登录(Single Sign-On) 是一种机制,让用户“只需登录一次,就能访问多个相互信任的系统”。

比如你登录了公司内部的门户系统,就可以自动访问邮箱系统、OA 系统、考勤系统,不需要重复登录。

核心

  • SSO 解决的是 “跨系统身份共享” 问题。

  • SSO 不规定用什么协议实现,但常见的实现协议包括:

    • SAML 2.0

    • CAS

    • OAuth 2.0 / OpenID Connect(OIDC)


三、两者的关系:OAuth 是 SSO 的基础之一

对比维度OAuth单点登录(SSO)
定义授权协议,让第三方访问资源机制,让用户一次登录多处使用
目标安全地授权资源访问统一身份认证
涉及角色资源所有者、资源服务器、客户端、授权服务器用户、身份提供商(IdP)、服务提供商(SP)
是否包含登录✅ 可能包含(例如结合 OIDC)✅ 登录是核心
是否等价❌ 不是❌ 不是

🔹 OpenID Connect(OIDC) 就是在 OAuth 2.0 之上扩展身份层
它才是真正常用于 SSO 的协议。 OIDC = OAuth 2.0 + 身份认证

🔹 OAuth 提供授权机制,OpenID Connect(基于 OAuth)提供认证机制,SSO 则利用这些协议实现“登录一次,处处可用”。