OpenID 和 OAuth 有什么区别?

我真的是想了解 OpenID 和 OAuth 之间的区别吗?也许它们是两个完全分开的东西?

答案

OpenID与身份验证有关(即证明您是谁), OAuth与授权有关(即在无需处理原始身份验证的情况下授予对功能 / 数据 / 等的访问权限)。

OAuth 可以在外部合作伙伴站点中使用,以允许访问受保护的数据而无需重新认证用户。

博客文章 “ 从用户的角度看 OpenID 与 OAuth” 从用户的角度对两者进行了简单的比较,“ OAuth-OpenID:如果您认为它们是同一个东西,您就在错误树上 ”,了解更多信息关于它。

比较 OAuth 和 OpenID 的三种方法:

1. 目的

OpenID 是为联合身份验证创建的,也就是说,允许第三方使用您已经拥有的帐户来为您的用户身份验证 。术语 “联合” 在这里很关键,因为 OpenID 的全部意义是可以使用任何提供程序(白名单除外)。您无需预先选择或与提供商协商交易,即可允许用户使用他们拥有的任何其他帐户。

创建 OAuth 是为了消除用户与第三方应用程序共享密码的需要 。它实际上是作为解决 OpenID 问题的一种方式开始的:如果您的站点支持 OpenID,则由于用户在您的站点上没有密码,因此无法使用 HTTP Basic 凭据(用户名和密码)来提供 API。

问题在于,用于身份验证的 OpenID 和用于授权的 OAuth 的这种分离是,这两个协议可以完成许多相同的事情。它们各自提供了不同实现所需的一组不同功能,但从本质上讲,它们是可以互换的。两种协议的核心都是断言验证方法(OpenID 仅限于 “我是谁” 断言,而 OAuth 提供了可以通过 API 交换为任何受支持断言的 “访问令牌”)。

2. 特点

两种协议都为站点提供了一种将用户重定向到其他地方并返回可验证断言的方法。 OpenID 提供身份声明,而 OAuth 以访问令牌的形式更通用,然后可以用来 “询问 OAuth 提供程序问题” 。但是,它们各自支持不同的功能:

OpenID - OpenID最重要的功能是其发现过程。 OpenID 不需要对要使用的每个提供程序进行硬编码。使用发现,用户可以选择他们想要认证的任何第三方提供程序。此发现功能还导致了 OpenID 的大多数问题,因为实现它的方式是使用 HTTP URI 作为大多数 Web 用户无法获得的标识符。 OpenID 的其他功能还包括它支持使用 DH 交换进行临时客户端注册,即时模式以优化最终用户体验,以及一种验证断言的方式,而无需与提供程序进行另一次往返。

OAuth - OAuth最重要的功能是访问令牌,该访问令牌提供了发出其他请求的持久方法。与 OpenID 不同,OAuth 并非以身份验证结尾,而是提供访问令牌以获取对同一第三方服务提供的其他资源的访问权限。但是,由于 OAuth 不支持发现,因此它需要预先选择并硬编码您决定使用的提供程序。访问您网站的用户不能使用任何标识符,只能使用您预先选择的标识符。另外,OAuth 没有身份的概念,因此将其用于登录意味着添加自定义参数(由 Twitter 完成)或进行另一个 API 调用以获取当前 “已登录” 用户。

3. 技术实施

两种协议在使用重定向获得用户授权方面具有共同的体系结构。在 OAuth 中,用户授权访问其受保护的资源,在 OpenID 中,授权其身份。但这就是他们分享的全部。

每种协议都有一种不同的计算签名的方式,用于验证请求或响应的真实性,并且每种协议都有不同的注册要求。

OpenID 主要用于标识 / 身份验证,因此stackoverflow.com知道我拥有chris.boyle.name (或chris.boyle.name位置),因此我可能是昨天拥有chris.boyle.name的同一个人,并且获得了一些声誉点。

OAuth 设计用于授权代表您执行操作,因此stackoverflow.com (或任何地方)可以在不知道您的 Twitter 密码的情况下自动请求许可,例如代表您发 Tweet。

许多人仍在访问它,因此这里有一个非常简单的图表来说明

OpenID_vs._pseudo-authentication_using_OAuth

礼貌的维基百科

OAuth

仅用于委派authorization - 表示您正在授权第三方服务访问权使用个人数据,而无需给出密码。同样,OAuth“会话” 通常比用户会话的生存期更长。这意味着 OAuth 旨在允许授权

即 Flickr 使用 OAuth 允许第三方服务代表他们发布和编辑人物图片,而无需他们提供闪烁的用户名和密码。

OpenID

用于authenticate单点登录身份。 OpenID 所要做的只是允许 OpenID 提供者证明您的身份。但是,许多站点使用身份验证来提供授权(但是可以将两者分开)

即,一个人在机场出示护照,以认证(或证明)其所用机票上的姓名。

如果您的用户可能只想使用 Facebook 或 Twitter 登录,请使用 OAuth。如果您的用户由于运行胡须而运行自己的 OpenID 提供程序,则请使用 OpenID,因为他们 “不希望别人拥有自己的身份”。

OpenID 和 OAuth 都是用于身份验证和 / 或授权的基于 HTTP 的协议。两者都旨在允许用户执行操作而无需向客户端或第三方提供身份验证凭据或一揽子权限。尽管它们很相似,并且提出了将两者一起使用的建议标准,但它们是独立的协议。

OpenID 用于联合身份验证。客户端接受任何提供者的身份声明(尽管客户端可以将其列入白名单或黑名单提供者)。

OAuth 适用于委托授权。客户端向提供者注册,提供者提供授权令牌,该令牌将被接受以代表用户执行操作。

OAuth 当前更适合于授权,因为身份验证后的进一步交互已内置在协议中,但是两种协议都在发展。 OpenID 及其扩展名可以用于授权,而 OAuth 可以用于身份验证,可以将其视为无操作授权。

  • OpenID是由 OpenID Foundation 控制的开放标准和分散式身份验证协议。
  • OAuth是用于访问委派的开放标准
  • OpenID Connect (OIDC)结合了 OpenID 和 OAuth 的功能,即同时进行身份验证和授权。

OpenID采用由某些 “OpenID 提供程序”(即身份提供程序(idP))管理的唯一URI的形式。

OAuth可以与 XACML 结合使用,其中 OAuth 用于所有权同意和访问委派,而 XACML 用于定义授权策略。

OIDC使用简单的 JSON Web 令牌(JWT),您可以使用符合OAuth 2.0规范的流来获取。 OAuth是直接关系到OIDC因为OIDC是建立在的 OAuth 2.0之上的验证层。

在此处输入图片说明

例如 ,如果您选择使用您的 Google 帐户登录Auth0,则您使用的是OIDC 。成功通过 Google 身份验证并授权Auth0访问您的信息后,Google 会将有关用户和已执行的身份验证的信息发送回Auth0 。此信息以JSON Web 令牌 (JWT)返回。您将收到一个访问令牌和一个 ID 令牌(如果要求)。 令牌类型来源:OpenID Connect

比喻
组织使用ID 卡进行身份识别,其中包含芯片,它存储有关员工的详细信息以及授权,即园区 / 门 / ODC 访问权限。 身份证充当OIDC芯片充当OAuth更多示例和表单Wiki

正如评论中指出的那样,我认为重新审视此问题是有道理的,OpenID Connect 的引入可能带来了更多的混乱。

OpenID Connect 是一种类似于 OpenID 1.0 / 2.0 的身份验证协议,但实际上它是基于 OAuth 2.0 构建的,因此您将获得授权功能以及身份验证功能。在这篇(相对较新但很重要)的文章中,详细解释了两者之间的区别: http : //oauth.net/articles/authentication/

OpenID,OAuth,OpenID Connect 之间的区别说明:

OpenID 是用于身份验证的协议,而 OAuth 是用于授权的协议。身份验证是要确保与您交谈的那个人确实是他声称的那个人。授权是决定应允许该人做什么。

在 OpenID 中,委派了身份验证:服务器 A 要对用户 U 进行身份验证,但是 U 的凭据(例如 U 的名称和密码)被发送到 A 信任的另一台服务器 B(至少是对用户进行身份验证的信任)。确实,服务器 B 确保 U 确实是 U,然后告诉 A:“好吧,那是真正的 U”。

在 OAuth 中,授权是委派的:实体 A 从实体 B 获得 “访问权限”,A 可以向服务器 S 显示要授予访问权限的 “访问权限”;因此,B 可以向 A 传递临时的特定访问密钥,而无需给它们过多的权限。您可以将 OAuth 服务器想象成一家大型酒店的关键主机。他向员工提供了打开他们应该进入的房间门的钥匙,但是每个钥匙都是有限的(不能进入所有房间);此外,几个小时后按键会自毁。

在某种程度上,如果实体 A 通过 OAuth 从 B 获得访问密钥并向服务器 S 显示访问密钥,则可以将授权滥用为某种伪身份验证,然后服务器 S 可以在授予访问权限之前推断出 B 认证了 A 键。因此,有些人在应该使用 OpenID 的地方使用 OAuth。这种模式可能有启发作用,也可能没有启发作用。但我认为这种伪身份验证比任何其他方法都更加令人困惑。 OpenID Connect 就是这样做的:它将 OAuth 滥用到身份验证协议中。在酒店类比中:如果我遇到一个自称的员工,并且那个人告诉我他有一把可以打开我房间的钥匙,那么我认为这是一位真正的员工,因为钥匙主人不会给他钥匙如果他不在,那将打开我的房间。

(资源)

OpenID Connect 与 OpenID 2.0 有何不同?

OpenID Connect 执行与 OpenID 2.0 相同的许多任务,但是以对 API 友好的方式进行,并且可由本机和移动应用程序使用。 OpenID Connect 定义了用于可靠签名和加密的可选机制。 OAuth 1.0a 和 OpenID 2.0 的集成需要扩展,而在 OpenID Connect 中,OAuth 2.0 的功能与协议本身集成在一起。

(资源)

OpenID connect 将为您提供访问令牌和 ID 令牌。 id 令牌是 JWT,包含有关已认证用户的信息。它由身份提供者签名,可以在不访问身份提供者的情况下进行读取和验证。

此外,OpenID connect 标准化了 oauth2 可以选择的很多方面。例如范围,端点发现和客户端动态注册。

这使编写代码更加容易,该代码使用户可以在多个身份提供者之间进行选择。

(资源)

Google 的 OAuth 2.0

Google 的 OAuth 2.0 API 可用于身份验证和授权。本文档介绍了我们的 OAuth 2.0 身份验证实现,该实现符合 OpenID Connect 规范并且已通过 OpenID 认证。 使用 OAuth 2.0 访问 Google API 中的文档也适用于此服务。如果您想以交互方式探索此协议,建议您使用Google OAuth 2.0 Playground

(资源)