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

Posted

技术标签:

【中文标题】使用 OAuth 保护我的 REST API,同时仍然允许通过第三方 OAuth 提供程序进行身份验证(使用 DotNetOpenAuth)【英文标题】:Securing my REST API with OAuth while still allowing authentication via third party OAuth providers (using DotNetOpenAuth) 【发布时间】:2011-06-02 06:30:35 【问题描述】:

我有一个带有简单 REST API 的产品,因此该产品的用户可以直接与产品的功能集成,而无需使用我的 Web 用户界面。

最近,各种第三方对将他们的桌面客户端与 API 集成以允许我的产品用户使用该第三方应用程序访问他们的数据感到兴趣。

我看到想要使用 Twitter 的应用程序使用 Twitter 托管的登录页面进行身份验证,该登录页面授予特定应用程序访问该用户数据的权限。单击“允许”或“拒绝”按钮,身份验证过程完成。据我所知,Facebook 使用的机制相同。

经过进一步研究,这似乎是 OAuth 在起作用,并且鉴于我的 API 是基于 .Net 的,我想我应该使用 DotNetOpenAuth 并提供类似的机制。不幸的是,这些示例的文档很少(如果有的话),我可以在网上找到的唯一教程似乎专注于帮助您为用户提供登录机制,以便他们可以使用第三方提供商登录您的网站。

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

基本上看起来我需要我的 API 以某种方式托管 OAuth 服务,但也让用户使用第三方 OAuth 服务。我不禁认为我对 OAuth 的了解还不够,无法确定我是否过于复杂化了事情,或者我正在尝试做的事情是好的还是坏的做事方式。

谁能给我至少大致了解一下我需要采取的步骤,或者我应该注意什么才能做到这一点?或者指点我一些教程?或者抨击我的提议并告诉我我要解决这个问题(在架构上)都错了?

【问题讨论】:

嗨,Nathan,我正在为与您在此处描述的类似情况而苦苦挣扎,想知道您是否有什么要添加到我的问题或关于如何解决我目前对 OpenID 缺乏了解的建议与我的 API ***.com/questions/16855131/… 集成 【参考方案1】:

首先我想强调一下身份验证和授权的区别:

用户通过提供一些凭据(例如用户名+密码)来对您的网站进行身份验证。 OpenID 允许通过让用户验证 到另一个服务来取代这一点,然后该服务代表用户向您的网站声明用户的身份。您的网站信任第三方服务(OpenID 提供者),因此认为用户已登录。

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

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

OpenID 专注于用户身份验证。 OAuth 专注于应用程序授权。但是,Facebook 和 Twitter 等少数服务选择使用 OAuth 进行身份验证授权,而不是使用 OpenID 进行身份验证和 OAuth 进行授权。

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

听起来您想要添加到此项目模板中的功能是让您的用户能够使用用户名+密码以及 OpenID 登录。此外,如果您希望 Facebook 和 Twitter 成为您的用户的一个选项,那么您也必须实现它,因为它们不使用 OpenID 标准。但 DotNetOpenAuth 下载包含使用 Twitter 和 Facebook 登录的示例,因此您可以在那里获得一些指导。

我怀疑您在授权方面不会有太多事情可做。正如我之前所说,它带有 OAuth,这对你来说可能就足够了。

【讨论】:

感谢您的详细回答,我会查看您提供的链接。澄清一下,我的 API 挂在我网站的子域上,所以从技术上讲,它不是同一个应用程序。 当资源归应用所有时,应用需要向授权服务器而不是用户验证自己的非典型场景。例如,facebook 应用程序可能会向 fb 资源服务器请求它在一段时间内收集的应用程序洞察力和统计数据。此场景在 OAuth2 的客户端凭据工作流程中得到解决 我可以在没有 oAuth 的情况下使用 REST API 吗? @安德鲁·阿诺特 当然。并非所有的 REST API 都需要身份验证。 oauth 并不是唯一的身份验证机制。【参考方案2】:

首先。您需要在精神上将您的 API 与身份验证方法区分开来。

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

OAuth 就是这样一种身份验证机制。成为 OAuth 提供者很棒,尽管规范有点难以掌握,尤其是与签名有关的部分。 一旦您使用了 OAuth,客户端应用程序通常可以轻松地进行身份验证,因为大多数语言都有很多“开源、已经完成、只需实现”的库。

OAuth 的优缺点已经争论了一段时间。但要形成你自己的观点,我建议阅读 this definitive guide, written by Eran Hammer-Lahav,他是负责 OAuth 规范的人之一。

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

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

【讨论】:

我可以在没有 oAuth 的情况下使用 REST API 吗? @乔恩尼兰德

以上是关于使用 OAuth 保护我的 REST API,同时仍然允许通过第三方 OAuth 提供程序进行身份验证(使用 DotNetOpenAuth)的主要内容,如果未能解决你的问题,请参考以下文章

什么是 OAuth,它如何保护 REST API 调用? [关闭]

使用 OAuth2 保护单体私有 REST api? [关闭]

使用 OAuth2.0 或 Azure Active Directory 保护 REST API

需要使用 Keycloak 和 oAuth2 保护普通 Spring REST API 的示例

需要使用Keycloack和oAuth2保护普通Spring REST API的示例

保护未经身份验证的 REST API