ChatGPT解决这个技术问题 Extra ChatGPT

使用 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 进行身份验证。

https://i.stack.imgur.com/neKuF.png

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

有人可以至少给我一个关于我需要采取的步骤的广泛概述,或者我应该看什么来实现这一点?或者指点我一些教程?或者抨击我的提议并告诉我我要解决这个问题(在架构上)都错了?

嗨,Nathan,我正在与您在此处描述的类似情况作斗争,想知道您是否有什么要添加到我的问题或关于如何解决我目前对 OpenID 与我的 API 集成的缺乏了解的建议stackoverflow.com/questions/16855131/…

A
Andrew Arnott

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

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

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

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

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

现在,对于您自己的项目,我强烈建议您查看 VS 库中提供的 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 并不是唯一的身份验证机制。
J
Jon Nylander

首先。您需要在精神上将您的 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 吗? @乔恩尼兰德