使用OAuth保护我的REST API,同时仍允许通过第三方OAuth提供者进行身份validation(使用DotNetOpenAuth)

我有一个简单的REST API产品,以便产品的用户可以直接与产品的function集成,而无需使用我的Web用户界面。

最近,我已经从各种第三方获得关于将他们的桌面客户端与API集成的兴趣,以允许我的产品的用户使用该第三方应用访问他们的数据。

我已经看到,希望使用Twitter进行authentication的应用程序使用Twitter托pipe的login页面,授予访问该用户数据的特定应用程序权限。 您单击“允许”或“拒绝”button,authentication过程完成。 Facebook使用相同的机制,我可以告诉。

进一步的研究,这似乎是OAuth的行动,并认为我的API是基于.Net的,我想我应该使用DotNetOpenAuth并提供一个类似的机制。 不幸的是,样本稀less地logging(如果有的话),我可以在网上find的唯一的教程似乎是专注于帮助您为您的用户提供一个login机制,使他们可以login到您的网站使用第三方提供商。

真正想要做的是让我的REST API处理我的Web应用程序的所有核心身份validation和业务逻辑,并且我的Web应用程序本质上是另一个仅通过OAuth使用API​​的应用程序。 用户可以直接使用他们的用户名和密码或通过第三方提供商(如MyOpenID或Facebook)在网站上进行身份validation,然后网站将以某种方式使用返回的令牌对REST API进行身份validation。

建筑图

它基本上看起来像我需要我的API以某种方式承载OAuth服务,但也有用户使用第三方OAuth服务。 我不禁想到,我对OAuth的掌握程度还不够,无法判断我是否过于复杂,或者我所要做的是做一件好事还是坏事。

有人能给我至less一个我需要采取的步骤的广泛的概述,或者我应该看看如何做到这一点? 或者指点我一些教程? 或者是抨击我的build议,并告诉我,我正在做这个(架构上)全错的?

首先我想强调authentication和授权的区别:

用户通过提供一些凭证(如用户名+密码)来validation您的网站。 OpenID允许通过让用户对另一个服务进行身份validation来取代这个服务,然后代表用户将用户身份标识到您的网站。 您的网站信任第三方服务(OpenID提供商),因此认为用户login。

服务应用程序不会validation您的网站 – 至less不典型。 用户授权服务或应用程序访问用户的数据。 这通常是由请求服务提供商授权的应用程序完成的,然后将用户发送到服务提供商,用户首先进行authentication(服务提供商知道与谁交谈),然后用户对该网站说:“是的, [应用程序]可以[以某种受限制的方式]访问我的数据。“ 从那时起,应用程序使用授权令牌来访问服务提供商网站上的用户数据。 请注意,应用程序并不authentication自己,就好像它是用户一样,但它使用另一个代码来确保服务被授权访问特定用户的数据。

因此,通过明确的区分,您可以完全独立地在您的网站上做出有关身份validation和授权的决定。 例如,如果您希望用户能够使用以下所有内容login:用户名+密码,OpenID和Facebook,则可以这样做。 一个完全正交的决定是你如何授权应用程序(有很多协议可以用于这个,OAuth当然是相当stream行)。

OpenID专注于用户authentication 。 OAuth专注于应用程序授权 。 然而,Facebook和Twitter等一些服务select使用OAuth进行身份validation授权,而不是使用OpenID进行身份validation,使用OAuth进行授权。

现在对于您自己的项目,我强烈build议您查看VS Gallery中提供的ASP.NET MVC 2 OpenID网站(C#)项目模板。 它带有OpenID身份validation OAuth服务提供程序支持。 这意味着您的用户可以使用OpenIDlogin,第三方应用程序和服务可以使用OAuth对您的网站进行API调用并访问用户数据。

听起来你想要添加到这个项目模板,一旦你开始是用户的能力,用户名+密码以及OpenIDlogin。 另外,如果你希望Facebook和Twitter成为你的用户的select,你也必须实现,因为他们不使用OpenID标准。 但DotNetOpenAuth下载包括用Twitter和Facebooklogin的样本,所以你有一些指导。

我怀疑在授权方面你不会有太多事情要做。 它和OAuth一样,正如我之前说过的那样,那可能就足够了。

首先。 你需要从心理上区分你的API和authentication方法。

你的API基本上是资源和操作这些资源的方法。 你可以有几种方法来authentication你对API的访问。

OAuth就是这样一种authentication机制。 作为一个OAuth提供商是伟大的,即使规格有点难以掌握,特别是与签名有关的部分。 一旦有了OAuth,客户端应用程序通常就可以轻松进行身份validation,因为在大多数语言中有许多“开源,已经完成,只是实现”的库。

OAuth的利弊已经有一段时间了。 但是为了形成你自己的观点,我build议阅读由 OAuth规范的负责人之一Eran Hammer-Lahav编写的权威指南 。

就我所见,OAuth的唯一真正替代品是OAuth 2.0,只是简单的基本身份validation。

除此之外,您正在讨论使用Open-ID或Facebook身份等进行身份validation。这是您需要自问的另一个问题。 但它确实超出了API和OAuth的范围。 对我来说,这更多的是在你的服务中创build用户的问题。 我可能是错的。