架构决策记录:身份认证与授权选项
Web 应用的身份认证(authentication)和授权(authorization)是保护应用和服务访问安全的两个关键概念。两者都涉及用户的身份以及权限如何授予,但关注的方面不同:
- 身份认证是验证用户或系统身份的过程。
- 授权是确定已通过认证的用户或系统可以访问哪些资源或执行哪些操作的过程。
下面,让我们深入了解你提到的具体协议和技术,它们常用于现代 Web 应用中管理身份认证和授权。
1. OAuth(开放授权)
OAuth 是一种开放的授权标准。它允许用户在不共享凭据的情况下,授予第三方应用对其资源的有限访问权限。其核心思想是委托访问。OAuth 常用于用户可以登录第三方服务(例如使用 Google 登录)而无需直接向第三方提供用户名和密码的场景。
- 流程:OAuth 通常遵循基于令牌的流程,由授权服务器向第三方应用颁发访问令牌。该令牌代表用户的权限,应用使用它从 API 访问用户的数据或资源。
- 示例:用户使用其 Google 账号登录某个第三方应用。Google 验证用户的身份,然后授予一个令牌,使第三方应用能够访问部分 Google 数据(例如 Google 日历)。
OAuth 并不直接处理身份认证;它关注的是授予访问权限。对于身份认证,OAuth 通常与其他协议(例如 OpenID Connect)搭配使用。
2. OpenID Connect(OIDC)
OpenID Connect(OIDC) 是构建在 OAuth 2.0 之上的身份层,在 OAuth 的授权能力之上增加了身份认证。本质上,OpenID Connect 扩展了 OAuth 以处理用户身份认证,并为应用提供了验证用户身份的标准化方式。
- 流程:当用户使用 OpenID Connect 登录时,第三方应用会请求一个 ID 令牌(除 OAuth 访问令牌之外)。ID 令牌包含有关用户的信息(例如用户名、电子邮件和其他声明)。这使应用能够知道用户是谁以及是否已通过认证。
- 示例:使用你的 Google 账号登录 Slack 等服务(Google 是 OpenID Connect 提供方),涉及通过 OpenID Connect 进行的身份认证,而 OAuth 则管理对你的 Google 资源的访问。
OIDC 使第三方应用更容易认证用户,同时仍然允许对这些应用可以访问的资源进行细粒度控制。
3. SAML(安全断言标记语言)
SAML 是一种较早的、基于 XML 的标准,用于在各方之间交换身份认证和授权数据,特别适用于**单点登录(SSO)**场景。它主要用于企业环境,使用户只需认证一次即可访问多个应用,而无需重新输入凭据。
- 流程:用户首先向身份提供方(IdP)进行认证。IdP 生成一个已签名的 SAML 断言,其中包含用户的身份和相关属性。该断言被发送给服务提供方(SP),SP 使用它来授权对应用的访问。
- 示例:员工登录公司门户(IdP),便自动登录到电子邮件、CRM 等其他系统,而无需重新输入凭据。认证过程基于 IdP 发送的 SAML 断言。
SAML 常用于企业 SSO 解决方案,非常适合企业环境中的 Web 应用,但与 OAuth/OIDC 相比,它对移动端不太友好。
4. WS-Federation(Web 服务联合)
WS-Federation 是另一种用于**单点登录(SSO)**的协议,特别是在基于 Microsoft 的企业环境中。它是 **WS-*(Web 服务)**规范系列的一部分,允许跨不同安全域(例如不同组织之间或不同服务之间)进行身份联合。
- 流程:WS-Federation 允许**受信任的身份提供方(IdP)**对用户进行认证,并颁发服务提供方可用于授权的令牌。它与 SAML 类似,但通常用于严重依赖 Microsoft 技术的场景。
- 示例:用户登录由 Microsoft Azure Active Directory(AD)托管的企业应用,其身份可用于访问其他联合服务,包括由第三方供应商托管的应用。
尽管在许多现代 Web 环境中,WS-Federation 已在很大程度上被 OAuth 2.0 和 OpenID Connect 等较新的协议取代,但它仍用于遗留系统,尤其是在以 Microsoft 为中心的企业中。
5. LDAP(轻量级目录访问协议)
LDAP 是一种用于访问和管理目录服务的协议,常用于在集中式目录(通常称为目录服务)中存储用户凭据并管理访问控制。LDAP 本身并不专门用于身份认证或授权,而是用于存储和检索身份数据,这些数据随后会用于上述流程。
- 身份认证:LDAP 允许应用通过向目录服务查询凭据(如密码)来认证用户。
- 授权:它还管理用户角色和权限,帮助确定用户是否可以访问某些资源。
- 示例:许多企业使用基于 LDAP 的目录(例如 Active Directory)进行身份认证和授权,尤其是在 Windows 环境中。
LDAP 对于企业管理跨内部系统的用户访问至关重要,但在现代 Web 环境中,LDAP 通常与 SAML 或 OAuth 等其他协议集成,以实现更完整的身份管理。
6. 社交 SSO 提供方
Facebook、Google、Twitter、GitHub 等社交单点登录(SSO)提供方,允许用户使用其社交媒体凭据登录第三方应用。这是一种基于 OAuth 的身份认证,其中第三方服务(例如 Google)充当身份提供方。
- 流程:用户点击“使用 Google 登录”(举例)。应用重定向到 Google,用户在那里登录(如果尚未登录)。然后 Google 向第三方应用提供访问令牌或 ID 令牌,可用于认证用户并可能访问其数据。
- 示例:许多应用允许你使用 Google 或 Facebook 凭据登录。应用会在幕后使用 OAuth 或 OpenID Connect 来验证你的身份,在某些情况下还会访问某些社交媒体数据。
社交 SSO 是一种方便且被广泛采用的认证方法,因为它减少了用户的阻力,他们可能不想再创建一组用户名和密码。
差异总结:
- OAuth:用于授权,允许第三方应用在不暴露凭据的情况下访问用户数据。
- OpenID Connect:扩展 OAuth 以提供身份认证,使应用能够验证用户身份。
- SAML:基于 XML 的 SSO 协议,常用于企业环境。
- WS-Federation:Microsoft 特有的身份联合协议,用于遗留系统。
- LDAP:用于查询目录服务以认证用户和管理授权的协议。
- 社交 SSO 提供方:基于 OAuth 的系统(如 Google、Facebook),允许第三方应用使用用户的社交媒体凭据认证用户。
这些技术各有其优势和使用场景,在现代应用中,你可能会看到它们被组合起来用于安全的不同方面(例如,用 OAuth/OIDC 进行 API 访问,用 SAML 进行企业 SSO)。