oauth区别 - OpenID和OAuth有什么区别?




connect协议 openid协议 (13)

这个问题不仅仅是一个答案,而是对上述伟大技术答案的补充。 我是很多领域的经验丰富的程序员,但是对网络编程总是不高兴。 现在试图使用Zend Framework构建一个基于Web的应用程序。

肯定会实现一个特定于应用程序的基本用户名/密码认证界面,但是认识到对于越来越多的用户来说,想到另一个用户名和密码是一种威慑。 虽然不完全是社交网络,但我知道应用程序的潜在用户中有很大一部分已经拥有Facebook或Twitter帐户。 应用程序并不真正需要或不需要从这些站点访问有关用户帐户的信息,它只是想提供方便,不需要用户设置新帐户凭据(如果他们不想)。 从功能的角度来看,这似乎是OpenID的招牌小孩。 但是,似乎facebook和twitter都不是OpenID供应商,尽管他们确实支持OAuth身份验证来访问其用户数据。

在我读过的关于这两者的文章以及它们之间的不同之处,只有在我看到卡尔安德森的观察之前,我才会说“OAuth可以用于认证,可以认为OAuth认为是无权限授权”我看到任何明确的证据表明OAuth足够满足我想要做的事情。

事实上,当我发布这个“答案”,当时不是会员的时候,我在这个页面的底部看到了很长时间,很难确定自己的选择。 使用OpenID登录或获得一个,如果我没有一个,但没有任何关于Twitter或Facebook,似乎表明,OAuth不适合这项工作。 但后来我又打开了另一个窗口,寻找了stackoverflow的一般注册过程 - 并且看到有许多第三方身份验证选项,包括Facebook和Twitter。 最后,我决定使用我的谷歌身份证(这是一个OpenID),正是因为我不想授予对我的朋友列表和其他任何Facebook喜欢分享其用户的其他内容的stackoverflow访问权限 - 但至少它是一个证明OAuth足够用于我的想法。

如果有人能够发布信息或指向支持这种多种第三方授权设置的信息的指针,以及如何处理撤销授权或失去对第三方站点的访问权限的用户,这真的很棒。 我还得到这样的印象,即我的用户名在这里标识出一个唯一的计算器帐户,如果我想要设置它,我可以通过基本身份验证访问该帐户,并且还可以通过其他第三方身份验证器访问同一个帐户(例如,以便我将被视为日志记录如果我登录到谷歌,Facebook或Twitter的任何一个,则进入stackoverflow ...)。 由于这个网站正在这样做,这里的某个人可能对这个主题有一些非常好的见解。 :-)

对不起,这段时间太长了,而且更多的是一个问题而不是答案 - 但卡尔的评论似乎是在OAuth和OpenID上的线程数量中发布的最合适的地方。 如果有这样一个更好的地方,我没有找到,我提前道歉,我尝试过。

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


如果您的用户可能只想使用Facebook或Twitter登录,请使用OAuth。 如果您的用户因为“不希望任何其他人拥有自己的身份”而运行自己的OpenID提供商,那么请使用OpenID。


OpenID是关于认证(即证明你是谁), OAuth是关于授权(即授权访问功能/数据/等等,而不必处理原始认证)。

OAuth可以在外部合作伙伴网站中使用,以允许访问受保护的数据,而不需要重新对用户进行身份验证。

从用户的角度来看 ,博客文章“ OpenID与OAuth ”有一个简单的比较,从用户的角度和“ OAuth-OpenID:如果您认为它们是相同的东西,咆哮错误的树 ”有更多信息关于它。


OpenId证明你是谁

OAuth授予访问某些功能


OAuth在授权之上构建身份验证:用户将对其身份的访问委托给应用程序,然后应用程序成为身份API的使用者,从而找出谁首先授权客户端http://oauth.net/articles/authentication/


我认为在评论中也指出了这个问题,OpenID Connect的引入可能会带来更多的混乱。

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


我想解决这个问题的一个特定方面,正如本评论中所描述的那样:

OAuth:在授予对某些功能的访问权限之前,必须完成认证,对吧? 所以OAuth = OpenId做了什么+授予访问某些功能的权限? - 哈桑马卡罗夫6月21日1:57

是的,没有。 答案很微妙,请耐心等待。

当OAuth流程将您重定向到目标服务(即OAuth提供程序)时,很可能您需要使用该服务进行身份验证,然后才会将令牌传递回客户端应用程序/服务。 结果令牌然后允许客户端应用程序代表给定用户发出请求。

请注意最后一句话的一般性:具体而言,我写的是“代表给定用户”, 而不是 “代表 ”。 假设“有能力与给定用户拥有的资源进行交互”意味着“您和目标资源的所有者是相同的”,这是一个常见的错误。

不要犯这个错误。

尽管您使用OAuth提供程序进行身份验证(例如,通过用户名和密码,或者可能使用SSL客户端证书或其他方式),但客户获得的回报并不一定被视为身份证明。 一个例子是将访问另一个用户资源的流程委托给您(以及通过代理,即OAuth客户端)。 授权不暗示认证。

要处理身份验证,您可能需要查看OpenID Connect,这实质上是OAuth 2.0设置的基础之上的另一层。 下面是一个引用(在我看来)关于OpenID Connect的最重要的观点(来自here ):

OpenID Connect是一个在2014年初发布的开放标准,定义了使用OAuth 2.0执行用户认证的可互操作方式。 从本质上讲,这是一个广泛出版的巧克力软糖的食谱,已经由众多专家进行过测试。 与其为每个潜在的身份提供者构建不同的协议,应用程序可以向想要使用的许多提供者说一种协议。 由于这是一个开放标准,所以任何人都可以实施OpenID Connect,而不受任何限制或知识产权方面的担忧。

OpenID Connect直接基于OAuth 2.0构建,并且在大多数情况下可以与OAuth基础架构一起部署(或在其之上)。 OpenID Connect还使用JSON对象签名和加密(JOSE)规范套件在不同地方携带签名和加密信息。 实际上,具有JOSE功能的OAuth 2.0部署对于定义完全兼容的OpenID Connect系统已经有很长的路要走,并且两者之间的增量相对较小。 但是,这个增量差异很大,OpenID Connect设法通过在OAuth基础中增加几个关键组件来避免许多陷阱:[...]

然后文档继续描述(除其他之外)令牌ID和UserInfo端点。 前者提供了一组索赔(你是谁,签发令牌时等,可能还有一个签名,通过发布的公钥验证令牌的真实性, 不必询问上游服务),后者提供了是指例如以标准方式询问用户的姓名,电子邮件和类似信息的方式(与OpenID Connect标准化之前人们使用的OAuth临时扩展相对)。


OAuth的

仅用于授权authorization - 这意味着您授权第三方服务访问权限使用个人数据,而不必提供密码。 此外,OAuth“会​​话”通常比用户会话寿命更长。 这意味着OAuth旨在允许授权

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

OpenID的

用于authenticate单一登录身份。 所有OpenID应该做的就是允许一个OpenID提供者证明你说你是。 但是很多网站使用身份验证来提供授权(但是可以将两者分离)

即一个人在机场出示他们的护照来验证(或证明)他们正在使用的机票上的姓名是谁。


我目前正在开发OAuth 2.0和OpenID连接规范。 所以这是我的理解:早些时候他们是:

  1. OpenID是谷歌的专有实施,允许第三方应用程序,如报纸网站,您可以使用谷歌登录和评论一篇文章等其他用例。 所以基本上,没有密码分享到报纸网站。 让我在这里提出一个定义,这种在企业方法中被称为联邦的方法。 在联盟中,您有一个可以进行身份​​验证和授权的服务器(称为IDP,身份提供者),并且通常是用户凭证的管理者。 您有业务的客户端应用程序称为SP或服务提供者。 如果我们回到同一个报纸网站的例子,那么报纸网站是SP,Google是IDP。 在企业中,这个问题早先使用SAML解决。 那个时候XML用来统治软件行业。 所以从webservices到配置,所有的东西都用到了XML中,所以我们有SAML,一个完整的联合协议
  2. OAuth:OAuth将它看作是一种标准,可以看到所有这些类型的专有方法,因此我们将OAuth 1.o作为标准,但只涉及授权。 没有多少人注意到,但它开始回暖。 然后,我们在2012年发布了OAuth 2.0。首席技术官们,建筑师们开始关注,因为世界正在朝着云计算发展,计算设备正朝着移动设备和其他类似设备发展。 OAuth被看作是解决软件客户可能向一家公司提供IDP服务的主要问题,并且拥有来自Salesforce,SAP等不同供应商的许多服务。因此,这里的集成看起来像联邦情况的一个大问题,使用SAML代价高昂所以让我们来探索一下OAuth 2.o. 哦,错过了一个重要的观点,那就是在这段时间内,谷歌感觉到OAuth实际上并没有解决身份验证问题,IDP如何将用户数据提供给SP(这实际上在SAML中有很好的解决方法)

    一个。 OAuth 2.o没有明确地说,客户端注册将如何发生b。 它没有提及SP(资源服务器)和客户端应用程序(如提供数据的分析服务器是资源服务器和显示该数据的应用程序是客户端)之间的交互的任何内容,

在技​​术上已经给出了精彩的答案,我想到给予简短的进化观点


有三种方法可以比较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使用OAuth来处理认证。

通过类比,它就像.NET依赖于Windows API。 您可以直接调用Windows API,但它非常广泛,复杂且方法论的参数非常庞大,您可能很容易犯错误/错误/安全问题。

与OpenId / OAuth相同。 OpenId依靠OAuth来管理身份验证,但是定义了特定的令牌(Id_token),数字签名和特定流程。


OpenID =使用来自OpenID提供商(Google)的登录凭证登录到其他应用程序(堆栈溢出)

OAuth =允许应用程序(TwitPic)代表您操作并访问您使用的应用程序(Twitter)的信息。

它们可以相互结合使用。