为什么我应该使用OpenID进行身份验证而不是OAuth?

Ale*_*ill 23 security openid oauth

我反复阅读过,OpenID比OAuth(用于授权)更适合身份验证,包括SO上的其他几个帖子.

案例似乎也在这篇经常被引用的文章中提出.

但是,我有点不清楚为什么我应该支持OpenID进行身份验证,而不是一个诚实的OAuth提供商(例如Twitter或Facebook OAuth 2.0).我读过其他SO帖子解释了不同的使用情况,我的理解之间什么协议被设计为做差价,但他们没有解释为什么一个人不能使用OAuth认证.

以下是我能提出的原因以及我(可能是误入歧途)的回复:

  1. OAuth真的用于授权.让用户使用OAuth进行身份验证可以为消费者提供比他们需要的更多权限.
    • 回复:这通常是正确的,但在细粒度OAuth(例如Facebook提供)的情况下,它只允许我只请求非常小的权限.事实上,Facebook等许多网站都提供OAuth,但不提供OpenID,可能是因为他们对授权消费者比认证客户更感兴趣.如果我想为客户提供更多身份验证选项,OAuth似乎会向我提供这些选项.
  2. OAuth会话往往寿命更长
    • 回复:如果我是消费者意图对客户进行身份验证,则无关紧要; 我会做自己的会话管理,甚至可以在我完成用户身份验证后立即删除OAuth令牌.

与使用大规模OAuth提供程序进行身份验证相比,OpenID提供了哪些身份验证优势?

Era*_*mer 12

您需要问自己的主要问题是,您是否提前知道要支持哪些提供商.如果您希望允许用户使用任何提供商(使用OpenID支持,如Google,Yahoo,AOL等),您应该使用OpenID.但是,如果您知道大多数用户想要使用Twitter,Facebook或其他一些流行的OAuth提供商,请使用它们.

技术术语是OAuth提供委托身份验证,而OpenID提供联合身份验证.现在,OAuth确实是授权协议而不是身份验证协议,但通过向您提供/我(Facebook)或/ account/verify_credentials(Twitter),这些提供商扩展了OAuth以用作身份验证协议.

但是你不应该使用OpenID.这是一个死的协议.

  • 如果您的用户可能拥有OpenID提供者身份并且您乐于允许任何提供者进行身份验证,包括自行发布的OpenID标识符(例如,为服务器使用Wordpress插件),则OpenID非常有用.问题是大多数自发行提供者都不安全.通过预先选择您信任的提供商并使用OAuth,您可以获得安全登录和访问令牌,以使用来自其他提供商的有用资源来扩展您的应用程序.我认为你可以使用OAuth获得更好的安全性. (5认同)
  • 我不确定OpenID是一个死的协议; 无论如何,它正在转向使用OpenID连接的OAuth,但这肯定肯定了我在提出这个问题时所怀疑的(基本上OAuth可以/被安全地用作OpenID进行身份验证).总结(如果我错了,请纠正我):出于一般目的,OpenID适用于身份验证,而OAuth可能不适用,但如果OAuth提供程序具有良好的身份验证API,则OAuth身份验证同样优秀/安全. (3认同)
  • @Eran Hammer - 您无法使用oauth可靠地实施"关联帐户".当用户使用oauth提供程序进行授权时,您的所有应用获取的都是访问令牌.您不能将此类访问令牌用作绑定到应用程序配置文件的唯一标识符,因为访问令牌可能会更改.因此,当令牌发生变化并且用户尝试使用相同的twitter oauth帐户(但是另一个令牌)尝试登录您的应用并在您的应用中使用相同的个人资料时 - >您的应用将无法知道该用户是谁.Oauth用于授权,而不是身份验证.你说这是一个死的协议 - 我认为你错了. (2认同)

drf*_*drf 10

使用OAuth进行身份验证的根本挑战是,您需要根据对给定资源的访问权限来假设一个身份.在某些情况下,这可能是一个有效的假设,但OAuth并不能保证.如果您对用于身份验证的资源的访问权限委托给另一方,并且您假设基于对该资源的访问权限的身份,那么这是一个漏洞,可以允许冒名顶替者代表其他订阅者进行身份验证.这与OAuth提供商的诚实或缺乏无关,以及与以未设计的方式使用的工具有关的一切.

对于Facebook,OAuth可以支持仅基于能够授权应用程序的订阅者进行身份验证的身份验证:如果您获得访问个人配置文件的授权,则表示订阅者必须已通过Facebook身份验证.看来这是一个受支持的用例.但是,如果Facebook稍后允许其他应用程序或用户代表其订户授权资源,则该保证将丢失.

最终,要使用OAuth进行身份验证,您需要做出很多假设.您需要假设您正在进行身份验证的用户,并且只有该用户才有权委派给定资源; 您必须假设您收到的请求数据足以绑定到已知身份; 你必须假设认证机制足以对第三方进行身份验证(如果文件不敏感并且可以授予匿名访问,该怎么办?); 你必须假设这些品质随着时间的推移而持续存在.OpenID专门为此而构建; OAuth不是.

你能安全地做出这些假设吗?在Facebook的情况下,可能; 它们似乎是文档化和支持的用例(我不熟悉特定的API).但一般来说,它不是受支持的OAuth用例.

  • 这是完全错误的.这两种协议都适用于身份验证,在实践中,OAuth通常提供更安全的实现. (8认同)