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

我有一个带有简单的 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 的理解还不够,无法判断我是否将事情过于复杂,或者我正在尝试做的事情是一种好的方式还是一种坏的方式。

有没有人能至少给我一个我需要采取的步骤的大致概述,或者我应该注意什么来实现这一点?或者给我指点一些教程?或者抨击我的提议,告诉我我在这方面(结构上)完全错了?

70637 次浏览

首先,你需要在思想上区分什么是你的 API-和认证方法。

您的 API 基本上是资源,以及操作这些资源的方法。您可以使用多种方法对 API 的访问进行身份验证。

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

OAuth 的利弊已经争论了一段时间。但是为了形成您自己的观点,我建议阅读 这个权威的指南,由 Eran Hammer-Lahav 撰写,它是负责 OAuth 规范的人员之一。

在我看来,OAuth 的唯一真正替代品是 OAuth 2.0和简单的基本身份验证。

除此之外,你还在讨论使用 Open-ID 或者 facebook 身份验证等等。这是你需要问自己的另一个问题。但它确实超出了 API 和 OAuth 的范围。对我来说,这更像是在您的服务中创建用户的问题。也许我错了。

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

使用者通过提供一些凭据(如用户名 + 密码)来对您的网站进行身份验证。OpenID 允许通过让用户 鉴定转移到另一个服务,然后由该服务代表用户向您的网站断言用户的身份。您的站点信任第三方服务(OpenID 提供者) ,因此考虑登录的用户。

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

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

OpenID 主要关注用户 认证。OAuth 主要关注应用程序 授权。然而,一些服务,如 Facebook 和 Twitter,选择使用 OAuth 进行 还有授权的身份验证,而不是使用 OpenID 进行身份验证,使用 OAuth 进行授权。

现在,对于您自己的项目,我强烈建议您查看可从 VS Gallery 获得的 NET MVC 2 OpenID 网站(C #)项目模板。开箱即用,附带 OpenID 身份验证 还有OAuthServiceProvider 支持。这意味着您的用户可以使用 OpenID 登录,第三方应用程序和服务可以使用 OAuth 对您的网站进行 API 调用并访问用户数据。

一旦您开始使用这个项目模板,您似乎想要添加的是用户使用用户名 + 密码以及 OpenID 登录的能力。此外,如果你想让 Facebook 和 Twitter 成为你的用户的一个选项,你必须实现这一点,因为他们不使用 OpenID 标准。但是下载的 DotNetOpenAuth 包含了登录 Twitter 和 Facebook 的示例,所以您可以在那里获得一些指导。

我怀疑你在授权方面没什么事可做。正如我之前所说的,它与 OAuth 一起提供,这对您来说可能已经足够了。