[译]什么是 OAuth?

原文链接:https://www.pubnub.com/guides/oauth/

什么是 OAuth?

OAuth(开放授权)是一种开放标准授权框架,允许第三方应用程序访问用户数据,而无需用户共享其登录凭据。它为用户提供了一种安全且标准化的方式,将其在一个网站上的资源的访问权限授予另一个网站或应用程序,而无需暴露其密码。

简单来说,OAuth 充当最终用户和他们想要授予访问权限的应用程序之间的中间人。用户不会直接向 Web 应用程序提供用户名和密码,而是会被重定向到授权服务器(例如 Google、Facebook 或 Twitter),在那里他们可以安全地验证自己的身份。经过身份验证后,用户可以授予或拒绝对其想要使用的应用程序上的数据的访问权限。

OAuth 是如何工作的?

OAuth 为用户提供了一种安全且标准化的方式来授权应用程序从各种来源(例如社交媒体平台或在线服务)访问其数据。

OAuth工作流程涉及三个主要方:用户、应用程序和服务提供商(也称为OAuth 服务器)。以下是 OAuth 流程的高级概述:

  1. 用户启动该过程:用户想要使用需要访问服务提供商上受保护资源的应用程序。用户首先向应用程序请求访问权限。
  2. 应用程序请求授权:应用程序将用户重定向到服务提供商的授权端点,以及必要的参数,例如应用程序的客户端 ID 和请求的访问范围。
  3. 用户授予授权:服务提供商在授权端点向用户显示登录屏幕。用户输入其凭据,如果有效,则系统会要求授予或拒绝应用程序访问其资源的请求。
  4. 服务提供商发出授权代码:如果用户授予授权,服务提供商会生成授权代码并将用户重定向回应用程序指定的重定向 URI。授权码是一个临时令牌,代表用户的同意。
  5. 应用程序用授权代码交换访问令牌:现在拥有授权代码的应用程序向服务提供商发送请求,以用代码交换访问令牌。该请求包括代码、应用程序的客户端 ID 和客户端密钥,它们用于向服务提供商验证应用程序的身份。
  6. 服务提供商验证授权代码:服务提供商对其进行验证并检查它是否与之前为用户生成的授权代码相匹配。如果代码有效,服务提供商将向应用程序颁发访问令牌。
  7. 应用程序使用访问令牌来访问受保护的资源:通过从服务提供商获得的访问令牌,应用程序现在可以代表用户发出请求以访问其受保护的资源。这些请求通常是向服务提供商的 API 端点发出的。
  8. 访问令牌过期和刷新:访问令牌的生命周期有限,过期后就会过期。要继续访问用户的资源,应用程序可以使用刷新令牌(如果提供)来获取新的访问令牌,而无需用户的参与。

使用 OAuth 有什么好处?

这种广泛采用的协议为构建实时聊天和消息应用程序的开发人员提供了多种好处:

增强的安全性: OAuth 消除了应用程序需要存储用户凭据的情况,从而降低了未经授权访问的风险。通过利用 OAuth,开发人员可以对用户进行身份验证和授权,而无需处理用户的敏感信息(例如密码)。这显着降低了数据泄露的可能性并增强了整体应用程序的安全性。

简化的用户体验: OAuth 使用户能够向第三方应用程序授予权限而无需共享其凭据,从而提供无缝且用户友好的体验。这消除了为每个应用程序创建和管理单独帐户的麻烦,从而提高了便利性和用户采用率。

可扩展性和互操作性: OAuth 使开发人员能够构建集成多个平台和服务的应用程序。通过利用 OAuth,开发人员可以轻松地验证和访问来自不同提供商的资源,从而允许他们的聊天和消息应用程序与其他系统无缝交互。这增强了可扩展性,并使开发人员能够利用不同平台的现有用户群。

细粒度的访问控制: OAuth 允许开发人员为其聊天和消息应用程序实施细粒度的访问控制。可以为每个资源授予权限,确保第三方应用程序只能访问所需的资源。这种对访问的精细控制有助于维护数据隐私和控制,降低未经授权的数据泄露的风险。

开发人员友好: OAuth 提供了一个简单、开发人员友好的框架,用于在聊天和消息传递应用程序中实现身份验证和授权。该协议有详细的文档记录,并受到各种库和 SDK 的支持,使开发人员可以轻松地将 OAuth 集成到他们的应用程序中。此外,OAuth 通过内置的令牌过期和撤销机制简化了访问令牌的管理。这简化了开发流程并降低了处理用户身份验证和授权的复杂性。

使用 OAuth 有哪些缺点?

虽然 OAuth 对于构建实时聊天和消息应用程序的开发人员来说具有众多优势,但也存在一些缺点。这些缺点包括:

**复杂性:**实施 OAuth 可能很复杂,尤其是对于不熟悉该协议的开发人员而言。该过程涉及多个步骤,包括注册应用程序、获取客户端凭据和处理授权流程。与多个身份提供商集成或处理刷新令牌时,复杂性可能会进一步增加。开发人员需要投入时间和精力来正确理解和实施 OAuth。

对第三方提供商的依赖: OAuth 依赖第三方身份提供商来对用户进行身份验证和授权。这种依赖性引入了潜在的单点故障。如果身份提供商遇到中断或更改其 API,则可能会中断聊天和消息传递应用程序的身份验证和授权过程。开发人员需要考虑所选身份提供商的可靠性和寿命。

用户隐私问题: OAuth 提供了一种安全的身份验证和授权机制,但一些用户可能担心与第三方应用程序共享其个人信息。尽管 OAuth 不会公开密码等敏感信息,但用户仍然需要授予访问其数据的权限。某些用户可能会犹豫是否授予这些权限,尤其是对于鲜为人知或不太受信任的应用程序。

**缺乏标准化:**尽管 OAuth 被广泛采用,但不同提供商和平台的实施可能存在差异。缺乏标准化可能会导致与多个系统集成时出现不一致和兼容性问题。开发人员可能需要额外的努力来处理这些变化并确保不同平台和提供商之间的兼容性。

**安全漏洞:**虽然 OAuth 的设计是安全的,但也存在发现和利用漏洞的情况。这些漏洞可能导致未经授权的用户数据访问或冒充攻击。开发人员必须及时了解最新的安全最佳实践,并定期修补 OAuth 实施中的任何漏洞。

OAuth 与 OpenID

OAuth 和OpenID是广泛使用的身份验证和授权协议,但用途不同。

OAuth 主要是一种授权协议,允许应用程序访问另一个系统上的用户资源,而无需共享其凭据。它通常用于委托授权场景,即用户向第三方应用程序授予访问其在特定网站或服务上的数据的权限。例如,当您使用 Google 帐户登录第三方应用程序时,OAuth 通常用于授予该应用程序访问您的 Google 云端硬盘或 Gmail 数据的权限。

另一方面,OpenID 是一种身份验证协议,使用户能够使用一组凭据在多个网站或应用程序中对自己进行身份验证。它允许用户使用其 OpenID 凭据登录多个网站,而不是为每个网站创建单独的用户名和密码。 OpenID 通常用作单点登录 (SSO ) 解决方案,为不想记住多个登录凭据的用户提供便利。

OAuth 与 OpenID Connect

OAuth 和OpenID Connect经常出现在 auth(身份验证和授权)协议方面。虽然它们是相关的并且具有相似的目的,但它们也有一些关键的区别。本节将探讨这些差异并帮助您了解何时使用其中一种而不是另一种。

OAuth:专注于授权

如前所述,OAuth 主要是一种授权协议。其主要目的是允许应用程序访问另一个系统上的用户资源,而无需共享其凭据。这是通过使用访问令牌来实现的。

OAuth 的典型用例是当用户想要授予第三方应用程序访问其在特定网站或服务上的数据的权限时。例如,当您使用 Google 帐户登录第三方应用程序时,OAuth 通常用于授予该应用程序访问您的 Google 云端硬盘或 Gmail 数据的权限。

OpenID Connect:专注于身份验证

另一方面,OpenID Connect 是一种身份验证协议。其主要目标是为用户提供一种标准化的方式来跨多个网站或应用程序进行身份验证。它允许用户使用一组凭据(OpenID)登录多个站点,从而无需记住多个用户名和密码。

除了身份验证之外,OpenID Connect 还提供有关用户的身份信息,例如姓名和电子邮件地址。此信息可用于应用程序内的个性化和定制目的。

OAuth 和 OpenID Connect 之间的主要区别之一是用户交互级别。当用户向第三方应用程序授予对其资源的访问权限时,通常会使用 OAuth。系统可能会提示用户登录其帐户并授予权限,但重点是资源访问而不是身份验证。

另一方面,OpenID Connect 是专门为身份验证而设计的。它允许用户使用一组凭据证明自己的身份并登录多个站点。这是通过 OpenID 提供商(例如 Google 或 Facebook)颁发的 OpenID 令牌来实现的,并且可用于跨多个站点对用户进行身份验证。

OAuth 和 OpenID Connect 之间的另一个区别是提供的安全级别。 OAuth 侧重于授权和访问控制,确保只有授权的应用程序才能访问用户的资源。它不直接提供身份验证或身份信息。

简而言之,OpenID Connect 在 OAuth 之上添加了一个身份验证层。它允许用户验证自己的身份并提供有关用户的身份信息。此信息是通过 ID 令牌获取的,ID 令牌由 OpenID 提供商颁发并包含用户姓名和电子邮件地址等信息。

OAuth 与 SAML

OAuth 和[SAML](https://support.google.com/a/answer/6262987?hl=en#:~:text=Security Assertion Markup Language (SAML,trying to access secure content.)都是广泛使用的身份验证和授权协议,但它们具有不同的用例和设计理念。

OAuth 通常用于委托授权场景,例如允许第三方应用程序访问特定网站或服务上的用户数据。它被设计为轻量级、可扩展且易于实施,使其成为集成外部服务和 API 的流行选择。

另一方面,SAML(安全断言标记语言)是一种基于 XML 的协议,用于在身份提供商 (IdP) 和服务提供商 (SP) 之间交换身份验证和授权数据。它通常用于单点登录 (SSO) 场景,其中用户可以使用一组凭据登录多个网站或应用程序。 SAML 使 IdP 能够通过数字签名的 XML 文档向 SP 断言用户的身份。这可以实现集中且安全的身份验证机制,特别是在企业环境中。

比较 OAuth 和 SAML 时,需要考虑几个关键差异:

OAuth 有哪些不同版本?

多年来,已经发布了多个 OAuth 版本来解决安全问题并改进功能。让我们探讨一下 OAuth 的不同版本:

OAuth 1.0:

OAuth 1.0 是定义授权核心原则的初始协议版本。它引入了令牌(请求和访问令牌)的概念来授予对受保护资源的访问权限。然而,OAuth 1.0 存在多个安全缺陷,包括要求共享消费者密钥,使其容易受到拦截攻击。

OAuth 1.0a

OAuth 1.0a 是 OAuth 1.0 的更新,解决了原始版本中的安全漏洞。它添加了签名机制来防止令牌拦截攻击。 OAuth 1.0a 使用三足授权流程,涉及用户、客户端应用程序和服务提供商。

OAuth 2.0

OAuth 2.0 是对 OAuth 1.0 的彻底重新设计和改进。它简化了授权过程,同时解决了其前身的缺点。 OAuth 2.0 引入了更灵活和可扩展的框架,支持各种授权流程,例如授权代码、隐式、资源所有者密码凭据和客户端凭据。它还允许使用不同的身份验证机制,例如用户名/密码和 JWT(JSON Web 令牌)。

OAuth 2.1:

OAuth 2.1 是 OAuth 协议的最新版本,于 2021 年发布。它的重点是提高安全性、澄清歧义并为开发人员提供更好的指导。 OAuth 2.1 对授权代码流引入了更严格的要求,并提供了实施安全令牌处理和撤销的建议。它还包括处理刷新令牌和客户端身份验证的额外安全注意事项。

OAuth 1.0 和 OAuth 2.0 之间的主要区别是什么?

OAuth 1.0 和 OAuth 2.0 在设计和功能上有显着不同。以下是两个版本之间的一些主要区别:

复杂:

与 OAuth 2.0 相比,OAuth 1.0 的设计更加复杂和严格。它需要加密签名和请求时间戳,使得实施过程更具挑战性。相反,OAuth 2.0 使用访问令牌提供了更简单、更灵活的框架。

代币用途:

在 OAuth 1.0 中,每个 API 请求中都会使用请求令牌和访问令牌,从而导致额外的开销和复杂性。 OAuth 2.0主要使用访问令牌,简化了令牌管理流程。

安全模型:

OAuth 1.0 依靠签名和时间戳来确保消息完整性并防止重放攻击。 OAuth 2.0更关注传输安全(例如HTTPS),并将令牌安全的责任留给了底层机制,例如安全存储和传输。 OAuth 2.0 还引入了刷新令牌的概念,用于在不涉及用户的情况下获取新的访问令牌。

授权流程:

OAuth 1.0仅支持一种授权流程,即三足一流程。此流程涉及用户、客户端应用程序和服务提供商。另一方面,OAuth 2.0 引入了多种授权流程,为不同的用例提供了更多的灵活性和选项。

应用范围:

OAuth 1.0 主要是为 Web 应用程序设计的,缺乏对移动和桌面应用程序的本机支持。另一方面,OAuth 2.0 旨在满足更广泛的应用程序,包括 Web、移动和桌面。

标准化:

OAuth 1.0 缺乏正式的标准化流程,导致其实施过程中出现变化和不一致。 OAuth 2.0 经历了标准化流程,创建了更加一致和可互操作的协议。

社区采用:

OAuth 2.0 获得了开发者社区和主要技术公司的更广泛采用和支持。它被广泛认为是现代应用程序中授权和身份验证的事实上的标准。

什么是 OAuth 访问令牌?

OAuth 访问令牌是应用程序用来代表用户访问受保护资源的凭据。它是一种授权机制,允许第三方应用程序在不知道用户登录凭据的情况下访问用户的数据。

当用户向应用程序授予访问其数据的权限时,应用程序会从授权服务器接收访问令牌。然后,此访问令牌用于验证和授权应用程序访问用户的资源,例如用户的个人资料信息或存储在服务器上的特定数据。

OAuth 访问令牌通常是短暂的,并且可以具有不同级别的范围或权限。范围定义应用程序可以代表用户访问的特定资源或操作。例如,应用程序可能仅具有对用户电子邮件地址的读取访问权限,但无法代表他们发送电子邮件。

访问令牌通常作为授权标头的一部分或作为请求 URL 中的参数与每个 API 请求一起传递。托管受保护资源的服务器验证访问令牌,以确保应用程序具有访问所请求资源的必要权限。

使用 OAuth 访问令牌有几个好处。首先,它增强了安全性,因为应用程序不需要存储或处理用户的登录凭据。其次,它允许用户授予或撤销对其数据的访问权限,而无需更改每个应用程序的登录凭据。此外,访问令牌的范围可以受到限制,从而为用户提供对应用程序可以访问哪些资源的细粒度控制。

代币类型:

OAuth 2.0 支持不同类型的访问令牌,具体取决于应用程序的特定用例和要求。最常用的令牌类型是:

代币流程:

获取 OAuth 访问令牌的过程通常涉及以下步骤:

代币管理:

在构建实时聊天和消息传递应用程序时,正确的令牌管理至关重要。以下是一些需要考虑的最佳实践:

有哪些不同类型的流量?

在身份验证和授权协议的上下文中存在多种类型的流。这些流程定义客户端应用程序如何获取和使用访问令牌来验证和授权对服务器的请求。以下是一些常用的流程:

授权代码流程**:**此流程通常用于服务器端应用程序,其中客户端应用程序可以安全地存储客户端机密。客户端将用户重定向到授权服务器的登录页面,用户在该页面进行身份验证并向客户端授予权限。然后,授权服务器使用授权代码将用户重定向到客户端应用程序。客户端将此代码交换为访问令牌和刷新令牌,可用于在当前访问令牌过期时获取新的访问令牌。

隐式流程**:**此流程适用于客户端应用程序,例如在 Web 浏览器中运行的基于JavaScript的应用程序。客户端应用程序将用户重定向到授权服务器的登录页面,用户在其中进行身份验证并授予权限。然后,授权服务器使用嵌入在 URL 片段中的访问令牌将用户重定向到客户端应用程序。客户端提取访问令牌并使用它来验证服务器请求。

资源所有者密码凭据流程**:**此流程适用于受信任的应用程序,例如本机移动应用程序,其中客户端应用程序可以安全地存储用户凭据。客户端应用程序收集用户的用户名和密码,并将其直接发送到授权服务器以获得访问令牌。不建议公共客户端应用程序使用此流程,因为它要求客户端应用程序处理和存储敏感的用户凭据。

客户端凭据流程:此流程最适合服务器到服务器的通信,其中客户端应用程序需要对自身而不是特定用户进行身份验证。客户端应用程序将其凭据(客户端 ID 和客户端密钥)直接发送到授权服务器以获取访问令牌。此流程不涉及用户身份验证,通常用于后端进程或 API。

设备授权流程**:**此流程专为输入功能有限的设备(例如智能电视或游戏机)而设计。客户端应用程序在设备屏幕上显示代码,并指示用户转到另一设备(例如智能手机或计算机)上的指定 URL 以输入代码并对设备进行授权。客户端应用程序定期轮询授权服务器以检查用户是否已完成授权。获得授权后,设备会收到访问令牌以代表用户发出请求。

验证 OAuth 请求的步骤是什么?

对 OAuth 请求进行身份验证涉及几个步骤,以确保客户端应用程序和服务器之间通信的安全性和完整性。以下是验证 OAuth 请求的一般步骤:

  1. 注册您的应用程序:在使用 OAuth 对请求进行身份验证之前,您必须向 OAuth 提供商注册您的应用程序。这通常涉及提供有关您的应用程序的信息,例如名称、网站 URL 和回调 URL。
  2. 获取客户端凭据:注册应用程序后,OAuth 提供商将提供客户端凭据,包括客户端 ID 和客户端密钥。这些凭据可作为向 OAuth 提供商识别和验证您的应用程序的一种方式。
  3. 发送授权请求:客户端应用程序通过将用户重定向到 OAuth 提供程序的授权端点来启动身份验证过程。此请求通常包括客户端 ID、请求范围以及身份验证后将重定向用户的重定向 URL 等参数。
  4. 用户身份验证和授权:用户被重定向到 OAuth 提供商的身份验证页面,系统会提示用户登录并授权客户端应用程序访问其资源。用户的同意是身份验证过程中的关键步骤,并确保客户端应用程序仅访问用户授权的数据。
  5. 接收授权:用户成功登录并授权客户端应用程序后,OAuth 提供程序将用户重定向回授权请求中指定的重定向 URL。重定向 URL 包括授权许可作为查询参数。
  6. 将授权授予交换为访问令牌:客户端应用程序必须将上一步中收到的授权授予交换为访问令牌。这涉及请求 OAuth 提供程序的令牌端点、提供授权、客户端凭据以及任何其他所需参数。令牌端点以访问令牌和刷新令牌(可选)进行响应。
  7. 使用访问令牌发出经过身份验证的请求:使用上一步中获取的访问令牌,客户端应用程序可以将其包含在对 OAuth 提供程序受保护资源的后续请求的 Authorization 标头中。这允许客户端应用程序代表用户访问用户的资源。
  8. 处理令牌过期和刷新:访问令牌的生命周期有限,过期后将无法再用于访问受保护的资源。要继续发出经过身份验证的请求,客户端应用程序可以使用步骤 6 中的刷新令牌来获取新的访问令牌。这涉及请求令牌端点并提供刷新令牌和客户端凭据。令牌端点以新的访问令牌和(可选)新的刷新令牌进行响应。

OAuth 和实时应用程序

OAuth 是一种广泛使用的协议,用于实时聊天和消息传递应用程序中的安全身份验证和授权。通过在应用程序中实施 OAuth,您可以提供安全、无缝的用户体验,同时降低数据泄露的风险。

订阅文章

订阅更新,不错过后续文章

直接通过 RSS 和 Telegram 订阅本站更新。

订阅 RSS关注 Telegram

分享文章

如果这篇有帮助,可以顺手转发

直接分享给同事、朋友,或者发到你的社交平台。

分享到 X 分享到 Telegram 邮件分享
[译]什么是长轮询?
[译]什么是Socket.IO?