Openid真的是一场噩梦吗?是否有一个开源库可以将所有内容“抽象”为内部ID?

时间:2010-11-17 22:01:52

标签: openid openid-provider

我不创建大型网站,所以我主要是openid的用户,它是各种各样的实现。我在这里使用openid,我喜欢它,因为我正在使用我的gmail账户(我计划将来退出gmail,但现在我用它来处理所有事情),所以我不必记住另一个登录/帐户。

所以,在我的天真的用户心目中,我认为使用openid是简单:你有很多提供者,当用户尝试登录时,你的应用会问他的/她的提供者:“这个人能够登录吗?”,提供者返回“此用户有效”的一些数据(有些数据可能返回的数据多于其他数据),或者如果它是一个不成功的登录,则不返回任何内容

我打算在未来的网站上使用openid。在我看来,我想我会使用某种可以为我“抽象”的lib:你的用户使用提供者登录,你的应用程序不知道每一个,这个lib从一个用户名返回一个唯一的标识符供应商。例如:myemail@gmail.com用于登录。它在lib中有一个唯一的id,在哈希计算之后返回,或者你的应用程序将它用于所有内容。

在我的应用程序中,我会尝试只处理由openid libm taht创建的id来处理facebook,twitter,gmail等。也许这个lib有一个带有提供者名称的表,当一个人第一次登录到你的站点时,你在数据库中有一行说“这个唯一的id来自twitter”。从理论上讲,这似乎在我的脑海中起作用。

...但是在阅读Openid is a Nightmare之后,我开始思考,如果找到一个能够如此完美地工作的lib,那真的是个好主意。

由于每个人(openid提供商)现在都拥有自己的登录机制,而不是只担心一个系统(我自己,我要创建自己的登录机制) - 现在我不得不担心几​​十个系统 - 而openid是应该解决完全那个问题。现在,我需要一个巨大的库,我想要抽象出这整个混乱。

我所描述的库是否存在?如果是这样,是否有可能创建一个至少试图表现得像一个真正“开放”梦想的应用程序?

(我知道openid与facebook auth不一样......但是从最终用户的角度来看,它是相同的恕我直言,“在网站上使用相同的登录”。我想抽象登录过程,即使协议不仅仅是为了那个。对于很多服务,你只需要知道某人是否是她自称的人。)

5 个答案:

答案 0 :(得分:11)

库存在(例如DotNetOpenAuth),但这些通常只为您抽象协议和规范 - 您的应用程序仍然必须了解各个提供程序(及其怪癖)。

在我看来,OpenId / OpenAuth最大的问题之一是许多提供商的做法略有不同:有些提供商会向您提供您要求的信息,有些则不会。其中一些响应Simpleregistration / Claim,其中一些响应AttributeExchange / Fetch。有些人使用一般网址登录,有些人需要使用一个用户名。

有许多微妙的差异,这使得OpenId比它应该的要弱很多。理想情况下,它应该是我(作为网站所有者)可以实现的系统,并且相信我现在支持任何拥有OpenId提供商帐户的用户。现实情况完全不同。即使您使用OpenId进行身份验证,也始终需要使用自己的ID跟踪用户。

有一些服务,例如RPX/Janrain旨在为您处理所有这些混乱的细节,但我听说即使这有其令人头疼的问题(例如,您在引用的文章中提到过)。

在一天结束时,它可能归结为您运行的网站类型。问问自己这个(相当愤世嫉俗的)问题 - 如果个人用户无法登录,我还要关心多少?如果答案是“很多”(因为每个问题将花费你的钱或引起其他悲伤),那么现在可能忘记openId。如果它是像stackoverflow这样的大众/免费网站,那么可能就是这样。


<强>更新

这里有一些提供程序实现的比较:http://spreadopenid.org/provider-comparison/。它不再更新,但它可能已经过时了。 [此刻可能是永久性的,但请参阅google's cache]

您可以通过Wikipedia's list of providers

找到更多信息

还有一个漂亮的comprehensive comparison of providers here

答案 1 :(得分:1)

有些图书馆会照顾所有这些,但它取决于您使用的技术。我已经将django-socialauth用于Django,它很棒(支持通过Twitter,Facebook,Gmail,Yahoo和OpenID进行身份验证)。有大量可用的库here

答案 2 :(得分:1)

您没有指定编程语言。

对于Java,你可能想看一下socialauth: http://code.google.com/p/socialauth/

答案 3 :(得分:1)

你所描述的更多是OAuth的工作方式,这是openid的继承者(松散地使用“后继者”一词 - 它比OpenID所做的更多牵引力。)对于ruby,有一些实现可用,尤其是janrain的Engage产品和最近的Intridea的omniauth库。我使用过Engage并且喜欢它,但omniauth看起来很简单,工作起来很开放,因为它不依赖于Janrain的服务。

答案 4 :(得分:1)

只是为了向该线程添加另一个资源,HybridAuth库是一个开源PHP,相当于上面提到的库。据我所知,它是唯一涵盖所有流行形式的联合身份验证,OAuth和OpenID for PHP的库。与我见过的其他人相比,文档和示例也相当不错。

我相信这个库仍然有点不成熟,但它确实是为PHP开发人员整合这个身份验证混乱的正确方向迈出的一步。

http://hybridauth.sourceforge.net/index.html