简体中文
  • iam
  • oauth
  • openid-connect
  • saml
  • sso
  • jwt

在一篇文章中理解 IAM、OAuth、OpenID Connect、SAML、SSO 和 JWT

身份和访问管理(IAM)的世界可能让人感到望而生畏和困惑。但别担心 - 这篇文章将分解它们的基础知识,帮助你看到更大的图景,并充满信心地导航这个复杂的领域。

Gao
Gao
Founder

身份和访问管理(IAM)领域近年来变得更加复杂。诸如 OAuthOpenID Connect (OIDC)SAMLSSOJWT 之类的术语经常被使用,但它们意味着什么?它们如何协同工作?让我们探索这些概念和框架,使它们变得更易理解和实用。

什么是 IAM?

身份和访问管理(IAM)是一个广泛的概念,涉及管理数字身份和实施访问控制。前面提到的框架和协议属于 IAM,每个都解决该领域的特定挑战。

本质上,IAM 是关于:

  • 身份:用户、服务或设备的数字表示。身份通常包含名称、电子邮件、角色等属性,以描述实体。
  • 访问:与资源互动、执行操作或使用服务的能力。访问定义了可以在哪些资源上执行哪些操作。

在上面的图中,用户(身份)希望在 API(资源)上执行 GET 请求。用户的属性 - 名称、电子邮件和角色 - 描述了身份。

认证 vs. 授权

认证和授权经常同时出现在 IAM 讨论中。让我们明确它们的定义:

  • 认证:验证身份所有权的过程。它回答了“你拥有什么身份?”这个问题。
  • 授权:确定经过身份验证的身份可以对资源执行哪些操作的过程。它回答了“你能做什么?”这个问题。

在之前的例子中:

  • 在用户(身份)可以执行任何操作之前,他们必须完成认证过程。
  • 认证完成后,系统需要确定用户是否可以在 API(资源)上执行 GET 请求(操作),即完成授权过程。

拥有这些基础知识后,让我们来解开其他缩写和协议的神秘面纱。

OAuth

OAuth 2.0,通常称为 OAuth,是一个授权框架,允许一个应用程序访问另一个应用程序上的受保护资源(通常代表用户)。

例如,假设你有一个名为 MyApp 的 Web 应用程序,想要访问用户的 Google Drive。与其要求用户共享他们的 Google Drive 凭据,MyApp 可以使用 OAuth 2.0 来请求 Google 的许可(授权)以访问用户的 Drive。

以下是 OAuth 流程的简化图示:

在此流程中:

  • MyApp 是请求访问 Google Drive(资源)的客户端(身份)。
  • 用户(资源所有者)在步骤 6 授予 MyApp 权限,完成授权过程。

OAuth 2.0 的一个关键元素是访问令牌,客户端使用它来展示用户访问资源的授权。深入了解,请参阅 Access token

OpenID Connect (OIDC)

OpenID Connect (OIDC) 是建立在 OAuth 2.0 之上的认证层。它添加了专门用于认证的功能,例如 ID 令牌UserInfo 端点,使其适用于认证和授权。

如果我们重温 OAuth 流程,添加 OIDC 会引入一个 ID 令牌。此令牌包含有关已认证用户的信息,并使 MyApp 能够验证用户的身份。

例子场景:“使用 Google 登录”

让我们换个例子。如果 MyApp 想要允许用户使用他们的 Google 帐户登录,目标就转向认证而不是资源访问。在这种情况下,OIDC 更加适合。以下是 OIDC 流程的样子:

关键区别:除了访问令牌,OIDC 提供了一个 ID 令牌,这使得 MyApp 能够在不需要额外请求的情况下认证用户。

OIDC 共享 OAuth 2.0 的 grant 定义,确保两个框架之间的兼容性和一致性。

SAML

安全断言标记语言 (SAML) 是一个基于 XML 的框架,用于在各方之间交换认证授权数据。SAML 于 2000 年代初引入,被广泛应用于企业环境。

SAML 如何与 OIDC 比较?

SAML 和 OIDC 在功能上相似,但在实现细节上有所不同:

  • SAML:使用基于 XML 的断言,通常被认为更复杂。
  • OIDC:利用 JSON 和 JWT,使其更轻便且更易于开发。

现代应用程序通常因其简单性和灵活性而偏好使用 OIDC,但 SAML 仍在遗留系统和企业用例中很普遍。

单点登录 (SSO)

单点登录 (SSO) 是一种认证方案,使用户能够使用一套凭据访问多个应用程序和服务。用户无需单独登录每个应用程序,只需一次登录即可访问所有连接的系统。

SSO 如何工作?

SSO 依赖于中心 身份提供者 (IdP) 来管理用户身份。IdP 验证用户并为连接的应用程序提供诸如认证和授权之类的服务。

IdP 可以使用 OIDC、OAuth 2.0、SAML 或其他协议提供这些服务。单个 IdP 可以支持多个协议,以满足不同应用程序的多样需求。

基于 OIDC 的 SSO 例子

让我们来探讨一个基于 OIDC 的 SSO 例子:

在此流程中,用户登录到 IdP 一次,并在多个应用程序(AppA 和 AppB)上进行认证。

企业级 SSO

尽管 SSO 是一个广泛的概念,你可能还会遇到企业级 SSO这个术语,它指专门为企业环境(通常为员工及合作伙伴)设计的 SSO。

当客户请求为你的应用程序使用 SSO 时,了解他们的需求和所使用的协议很重要。在大多数情况下,这意味着对于特定的电子邮件域,他们希望你的应用程序将用户重定向到他们的 IdP(实现了企业级 SSO)进行认证。

添加企业级 SSO 提供者的例子

以下是将你的应用程序(MyApp)与企业级 SSO 提供者(Banana)集成的简化例子:

JWT

JSON Web Token (JWT) 是在 RFC 7519 中定义的一个开放标准,支持两个方之间的安全通信。它是 OIDC 中 ID 令牌的标准格式,并广泛用于 OAuth 2.0 访问令牌。

JWT 的关键特性:

  • 紧凑:JWT 是 JSON 对象,采用紧凑格式编码,便于传输和存储。
  • 自包含:JWT 包含关于用户和令牌本身的所有必要信息。
  • 可验证和可加密:JWT 可以被签名和加密,以确保数据的完整性和保密性。

典型的 JWT 看起来像这样:

这个 JWT 由由点隔开的三部分组成:

  • Header:包含令牌的元数据,例如令牌类型和签名算法。
  • Payload:包含关于身份和令牌本身的信息。
  • Signature:验证令牌的完整性。

Header 和 Payload 都是 base64 编码的 JSON 对象。上面的 JWT 可以解码如下:

使用 JWT,客户端可以解码令牌并提取用户信息,而无需向身份提供者发出额外请求。要了解有关 JWT 的更多信息,请访问 JSON Web Token (JWT)

回顾

我们在这篇文章中涵盖了很多内容。让我们用一个例子来总结关键点:

假设你有一个需要**身份和访问管理(IAM)**解决方案的 Web 应用程序 AppA。你选择了 Logto,一个使用 OpenID Connect (OIDC) 进行认证的身份提供者。由于 OIDC 是建立在 OAuth 2.0 之上的,因此 Logto 还支持你的应用程序进行授权。

为了减少用户的摩擦,你在 Logto 中启用了“使用 Google 登录”。这使用 OAuth 2.0 交换授权数据和用户信息在 Logto 和 Google 之间。

用户通过 Logto 登录 AppA 后,AppA 接收到一个包含用户信息的 JSON Web Token (JWT) 类型的 ID 令牌。

随着业务的发展,你推出了一个新应用程序 AppB,也需要用户认证。由于 Logto 已经设置好,你可以重复使用相同的认证流程用于 AppB。你的用户现在可以通过一套凭据登录 AppA 和 AppB,这一功能称为单点登录 (SSO)

后来,一个商务合作伙伴请求你连接他们使用 安全断言标记语言 (SAML) 的企业级 SSO 系统。你发现 Logto 支持 SAML 连接,因此你设置了 Logto 与合作伙伴 SSO 系统之间的连接。现在,合作伙伴组织的用户也可以使用他们现有的凭据登录 AppA 和 AppB。


希望这篇文章帮助你厘清这些概念。欲获取更深入的解释和例子,请访问 Auth Wiki。如果你正在为应用程序寻找 IAM 解决方案,考虑使用诸如 Logto 之类的托管服务可以节省时间和精力。