使用DotNetOpenAuth,保护我的REST API,并仍然允许通过第三方OAuth提供程序进行身份验证。

144
我有一个带有简单REST API的产品,使得产品的用户可以直接集成产品的功能而不使用我的Web用户界面。
最近,我收到了来自各种第三方的兴趣,希望将他们的桌面客户端与API集成,以便我的产品用户可以使用第三方应用程序访问其数据。
我看到想要使用Twitter的应用程序会使用由Twitter托管的登录页面进行身份验证,该页面授予特定应用程序访问该用户数据的权限。您点击“允许”或“拒绝”按钮,认证过程就完成了。Facebook使用相同的机制,据我所知。
经过进一步研究,这似乎是OAuth在起作用,考虑到我的API基于.Net,我认为我应该使用DotNetOpenAuth并提供类似的机制。不幸的是,示例文档很少(如果有的话),我能够在网上找到的唯一教程似乎都集中在帮助您为用户提供登录机制,以便他们可以使用第三方提供者登录您的网站。
我真正想做的是让我的REST API处理我的Web应用程序的所有核心身份验证和业务逻辑,并且在幕后,我的Web应用程序本质上只是另一个使用OAuth通过API的应用程序。用户将直接使用用户名和密码或通过MyOpenID或Facebook等第三方提供者在网站上进行身份验证,然后网站将以某种方式使用返回的令牌对REST API进行身份验证。

Architectural Diagram

基本上看起来我需要让我的API以某种方式托管OAuth服务,但也要让用户使用第三方OAuth服务。我不禁想到我对OAuth的掌握还不够,无法确定我是否过于复杂化了事情,或者我正在尝试做的是好事还是坏事。
有人能给我至少一个大致的步骤概述,或者告诉我该看什么来实现这一点吗?或者指导我一些教程?或者猛烈抨击我的提议,告诉我我(在架构上)完全错了?

嗨,Nathan,我正在遇到与你在这里描述的类似情况的困境,想知道你是否有什么可以补充我的问题或建议如何解决我目前对OpenID集成我的API的理解不足的问题。https://dev59.com/HXLYa4cB1Zd3GeqPbcWd - Jammer
2个回答

124

首先我想强调认证和授权之间的区别:

用户通过提供某些凭据(如用户名+密码)来对您的网站进行身份验证。OpenID 允许将此替换为用户通过另一个服务进行身份验证,然后该服务代表用户向您的网站断言用户的身份。您的网站信任第三方服务(OpenID 提供者),因此将用户视为已登录。

服务应用程序通常不会对您的网站进行身份验证。用户为服务或应用程序授权访问其数据。通常,应用程序请求服务提供商的授权,然后将用户发送到服务提供商,在那里用户首先验证身份(以便服务提供商知道它正在与谁交谈),然后用户对站点说“是的,[应用程序]可以以某种受限方式访问我的数据”。从那时起,应用程序使用授权令牌访问服务提供商网站上的用户数据。请注意,应用程序不会像用户一样对自己进行身份验证,而是使用另一个代码向服务提供商保证其已获得授权以访问特定用户的数据。

因此,通过澄清这一区别,您可以完全独立地在您的网站上做出关于身份验证和授权的决策。例如,如果您希望用户能够使用以下所有方式登录:用户名+密码、OpenID 和 Facebook,则可以这样做。一个完全正交的决策是如何授权应用程序(有许多协议可供选择,当然 OAuth 非常流行)。

OpenID专注于用户认证。OAuth专注于应用程序授权。然而,一些服务(如Facebook和Twitter)选择使用OAuth进行认证和授权,而不是使用OpenID进行认证和OAuth进行授权。

现在针对您自己的项目,我强烈建议您查看从VS Gallery提供的ASP.NET MVC 2 OpenID网站(C#)项目模板。它默认支持OpenID身份验证和OAuth服务提供商支持。这意味着您的用户可以使用OpenID登录,并且第三方应用程序和服务可以使用OAuth调用API来访问您的网站和用户数据。

一旦开始,您需要添加的功能似乎是允许用户使用用户名+密码以及OpenID登录。此外,如果您希望Facebook和Twitter成为用户的选项,则必须实现该功能,因为它们不使用OpenID标准。但是,DotNetOpenAuth下载包括使用Twitter和Facebook登录的示例,因此您有一些指导。

我认为您在授权方面不需要太多工作。正如我之前所说,它具备OAuth功能,这可能已经足够了。


感谢您提供详细的答案,我会查看您提供的链接。为了澄清,我的API挂在我的网站子域名下,因此它并不是同一个应用程序。 - Nathan Ridley
1
应用程序需要向授权服务器进行身份验证而不是用户的非典型场景出现在资源由应用程序拥有的情况下。例如,Facebook 应用程序可能会请求 fb 资源服务器获取其在一段时间内收集的应用洞察和统计数据。这种情况在 OAuth2 的客户端凭据工作流程中得到解决。 - SenG
我可以在没有oAuth的情况下使用REST API吗?@Andrew Arnott - Gem
当然,并非所有的REST API都需要身份验证。而且OAuth并不是唯一的身份验证机制。 - Andrew Arnott

11

首先,你需要在心理上将你的API与认证方法区分开来。

你的API基本上是资源和操作这些资源的方法。而且你可以有几种认证访问你的API的方法。

OAuth是其中一种认证机制。成为一个OAuth提供者非常好,尽管规范有点难以理解,特别是与签名有关的部分。一旦你使用OAuth,客户端应用程序通常很容易进行身份验证,因为大多数语言都有很多“开源、已经完成,只要实现”的库可用。

OAuth的优缺点已经被辩论了一段时间。但为了形成自己的观点,我建议阅读由OAuth规范的负责人之一Eran Hammer-Lahav编写的这本权威指南

就我所看到的,除了OAuth 2.0和简单的基本身份验证外,OAuth没有真正的替代品。

除此之外,你还可以使用Open-ID或Facebook Identity等进行身份验证。这是你需要问自己的另一个问题。但它确实超出了API和OAuth的范围。对我来说,那更像是关于在服务中创建用户的问题。我可能是错的。


我可以不使用OAuth来使用REST API吗?@Jon Nylander - Gem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接