OpenID和OAuth有什么区别?

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

OpenID是关于authentication(即certificate你是谁), OAuth是关于授权(即授权访问function/数据/等等,而不必处理原始authentication)。

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

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

有三种方法可以比较OAuth和OpenID:

1.用途

OpenID是为联合身份validation而创build的,也就是让第三方通过使用他们已有的帐户为您validation用户 。 联邦这个术语在这里很重要,因为OpenID的重点是任何提供者都可以使用(除了白名单)。 您无需事先select或与供应商协商交易,以允许用户使用他们拥有的任何其他账户。

创buildOAuth是为了消除用户与第三方应用程序共享密码的需求 。 它实际上是为了解决OpenID问题而开始的:如果您在网站上支持OpenID,则不能使用HTTP Basic凭据(用户名和密码)来提供API,因为用户在您的网站上没有密码。

问题在于,将OpenID用于身份validation和用于授权的OAuth的分离是两种协议都可以完成许多相同的事情。 他们每个人都提供了不同的实现所需的不同的function,但基本上,它们是可以互换的。 这两个协议的核心都是一个断言validation方法(OpenID仅限于'我是谁'断言,而OAuth提供了一个“访问令牌”,可以通过API交换任何支持的断言)。

2.特点

这两个协议都提供了一种方法,让网站将用户redirect到其他地方,并返回一个可validation的断言。 OpenID提供身份断言,而OAuth则以访问令牌的forms更为通用,然后可用于“询问OAuth提供者的问题” 。 但是,他们各自支持不同的function:

OpenIDOpenID最重要的特性就是它的发现过程。 OpenID不需要提前对每个您想要使用的提供者进行硬编码。 使用发现,用户可以select任何他们想要authentication的第三方提供商。 这个发现function也导致了大部分OpenID的问题,因为它实现的方式是通过使用HTTP URI作为大多数Web用户所不具备的标识符。 其他functionOpenID支持使用DH交换的即席客户端注册,优化最终用户体验的即时模式,以及validation断言而无需向提供商​​再次往返的方式。

OAuthOAuth最重要的特性是访问令牌,它提供了一个持久的方法来提出额外的请求。 与OpenID不同,OAuth不会以身份validation结束,但会提供访问令牌以访问由同一第三方服务提供的其他资源。 但是,由于OAuth不支持发现,因此需要预先select并硬编码您决定使用的提供程序。 访问您的网站的用户不能使用任何标识符,只能使用您预先select的标识符。 此外,OAuth没有身份的概念,所以使用它的login意味着添加一个自定义的参数(如Twitter所做的)或进行另一个API调用来获取当前“login”的用户。

3.技术实施

这两种协议在使用redirect获得用户授权方面共享一个共同的架构。 在OAuth中,用户授权访问受保护的资源,并以OpenID身份访问其身份。 但是这就是他们分享的一切。

每个协议都有不同的计算签名的方式来validation请求或响应的真实性,并且每个协议都有不同的注册要求。

OpenID(主要)用于识别/身份validation,以便stackoverflow.com知道我拥有chris.boyle.name (或任何地方),因此我可能是昨天拥有chris.boyle.name的同一个人,并赢得了一些声望点。

OAuth旨在授权您代表您执行操作,以便stackoverflow.com (或任何地方)可以自动请求您代表“Tweet”的权限,而无需知道您的Twitter密码。

许多人仍然访问,所以这是一个非常简单的图解释

OpenID_vs._pseudo-authentication_using_OAuth

礼貌维基百科

OAuth的

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

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

OpenID的

用于authenticate单一login身份。 所有的OpenID应该做的就是允许一个OpenID提供商certificate你说你是。 然而,许多网站使用身份authentication来提供授权(然而,两者可以分离出来)

即一个在机场显示他们的护照以validation(或certificate)他们正在使用的票上的姓名是谁。

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

OpenID和OAuth都是用于身份validation和/或授权的基于HTTP的协议。 两者都旨在允许用户在不向客户端或第三方授予身份validation凭据或一揽子许可权的情况下执行操作。 虽然它们是相似的,并且提出了将它们一起使用的标准,但它们是单独的协议。

OpenID旨在用于联合身份validation。 客户端接受来自任何提供者的身份断言(尽pipe客户端可以自由列入白名单或黑名单提供者)。

OAuth用于委托授权。 一个客户向一个提供者注册,提供者提供授权令牌,代表用户执行动作。

OAuth目前更适合于授权,因为authentication之后的进一步交互被构build到协议中,但是两种协议都在不断发展。 OpenID及其扩展可以用于授权,OAuth可以用于authentication,可以认为这是一个没有权限的授权。

我相信在评论中也指出了这个问题,OpenID Connect的引入可能会带来更多的困惑。

OpenID Connect是一个像OpenID 1.0 / 2.0这样的authentication协议,但它实际上是build立在OAuth 2.0之上的,所以你将获得authenticationfunction以及authenticationfunction。 这两者之间的区别在这个(相对最近但很重要的)文章中有详细的解释: http : //oauth.net/articles/authentication/

这个问题不仅仅是一个答案,更多的是对上述伟大的技术答案的一些看法。 我是一些经验丰富的程序员,但是对于networking编程总是没有意义。 现在试图使用Zend Framework构build一个基于Web的应用程序。

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

在所有关于这两者的文章以及它们之间的不同之处,只有在我看到卡尔·安德森(Karl Anderson)的上述观察之后,才会想到“OAuth可以被用于authentication,这可以被认为是无权限的授权”我看到有任何明确的证据表明OAuth足够满足我想做的事情。

实际上,当我去发表这个“答案”,而不是当时的成员,我在这个页面的底部看了很长时间,很难找出自己的select。 使用OpenIDlogin或者如果我没有一个,但没有任何关于Twitter或Facebook的select,似乎表明,OAuth不适合这项工作。 但后来我又打开了另一个窗口,寻找了stackoverflow的一般注册过程,并且看到有许多第三方authentication选项,包括Facebook和Twitter。 最后,我决定使用我的谷歌身份证(这是一个OpenID的),正是因为我不想授予对我的朋友列表和其他任何Facebook喜欢分享有关其用户的东西的stackoverflow访问 – 但至less它是一个certificateOAuth足以满足我的要求。

如果有人能够发布有关支持这种多种第三方授权设置的信息或指示信息,以及如何处理撤销授权或无法访问第三方网站的用户,那真是太棒了。 我还得到这样的印象,即我的用户名在这里标识了一个唯一的计算器帐户,如果我想设置它,可以使用基本authentication访问,并且还可以通过其他第三方authentication器访问同一个帐户(例如,以便我将被视为日志logging如果我login到任何谷歌,脸谱或叽叽喳喳…到stackoverflow)。 由于这个网站正在这样做,这里的某个人可能对这个主题有一些非常好的见解。 🙂

对不起,这是如此之久,而且更多的是一个问题,而不是一个答案 – 但卡尔的评论似乎是在OAuth和OpenID的线程量中发布的最合适的地方。 如果有一个更好的地方,我没有find,我提前道歉,我也尝试过。

OpenID,OAuth,OpenID Connect之间的区别解释:

OpenID是用于身份validation的协议,OAuth则用于授权。 authentication就是要确保你所说的那个人确实是他自称的那个人。 授权是关于决定什么人应该被允许做。

在OpenID中,authentication被委托:服务器A想要authentication用户U,但是U的凭证(例如U的名字和密码)被发送到A信任的另一个服务器B(至less信任authentication用户)。 事实上,服务器B确保U确实是U,然后告诉A:“好吧,那是真正的U”。

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

在某种程度上,授权可以被滥用到一些伪authentication中,如果实体A通过OAuth从B获得一个访问密钥,并将其显示给服务器S,则服务器S可以在授予访问之前推断出Bauthentication的A键。 所以有些人在使用OpenID的地方使用OAuth。 这个模式可能会启发,也可能不启发。 但我认为这种伪authentication比任何事情都更令人困惑。 OpenID Connect就是这样做的:它将OAuth滥用到authentication协议中。 在酒店的比喻中:如果我遇到一个声称的雇员,那个人告诉我他有一把钥匙打开我的房间,那么我想这是一个真正的雇员,在这个关键的主人不会给他一个钥匙如果他不在,我会打开我的房间。

(资源)

OpenID Connect如何与OpenID 2.0不同?

OpenID Connect执行许多与OpenID 2.0相同的任务,但是这样做的方式是API友好的,并且可以被本机和移动应用程序使用。 OpenID Connect为可靠的签名和encryption定义了可选的机制。 尽pipeOAuth 1.0a和OpenID 2.0的集成需要扩展,但在OpenID Connect中,OAuth 2.0function与协议本身集成在一起。

(资源)

OpenID连接会给你一个访问令牌加一个ID令牌。 id令牌是一个JWT,并包含有关经过validation的用户的信息。 它由身份提供者签名,可以在不访问身份提供者的情况下阅读和validation。

另外,OpenID连接标准化了oauth2留给select的相当多的东西。 例如范围,端点发现和客户端的dynamic注册。

这使编写代码更容易,让用户在多个身份提供者之间进行select。

(资源)

Google的OAuth 2.0

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

(资源)

OpenIdcertificate你是谁

OAuth授予访问某些function

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

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

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

在技​​术上已经有了很好的答案,我想到了给予简短的进化观点

OpenId使用OAuth来处理authentication。

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

与OpenId / OAuth相同。 OpenId依靠OAuth来pipe理身份validation,但是定义了一个特定的令牌(Id_token),数字签名和特定的stream程。

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

OAuth:在授予访问某些function之前,必须完成authentication,对吗? 所以OAuth = OpenId做了什么+授予访问某些function? – 哈桑马卡罗夫6月21日在1:57

是的,没有。 答案是微妙的,所以忍受着我。

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

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

不要犯这个错误。

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

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

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

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

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

OAuth在授权之上构build身份validation:用户将对其身份的访问权委托给应用程序,然后该应用程序成为身份API的使用者,从而找出谁是第一个授权客户端http://oauth.net/文章/authentication/