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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我有一个简单的RESTAPI产品,这样产品的用户就可以直接与产品的特性集成,而无需使用我的Web用户界面。

最近,我得到了不同的第三方的兴趣,他们的桌面客户端与API集成,允许我的产品的用户使用第三方应用程序访问他们的数据。

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

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

我会怎么做真的让RESTAPI处理我的Web应用程序的所有核心身份验证和业务逻辑,在幕后,我的Web应用程序本质上是另一个通过OAuth使用API的应用程序。用户可以直接使用用户名和密码在网站上进行身份验证,也可以通过第三方提供者(如MyOpenID或Facebook)进行身份验证,然后网站将以某种方式使用返回的令牌对RESTAPI进行身份验证。

基本上,我需要我的API来托管OAuth服务,但也需要用户使用第三方OAuth服务。我忍不住认为我对OAuth的把握还不够,无法决定我是把事情复杂化了,还是想做的事情是好的还是坏的。

提问于
用户回答回答于

首先,我要强调身份验证和授权之间的区别:

用户通过提供某些凭据(如用户名+密码)对网站进行身份验证。OpenID允许通过让用户替换它认证其他服务,然后该服务代表用户向网站声明用户的身份。站点信任第三方服务(OpenID提供者),因此考虑用户登录。

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

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

OpenID的重点是用户。OAuth专注于应用程序。然而,一些服务,如Facebook和Twitter已经选择使用OAuth进行身份验证。授权而不是使用OpenID进行身份验证,使用OAuth进行授权。

现在,对于您自己的项目,我强烈建议查看项目模板可从VS库。它随OpenID身份验证而来OAuth服务提供商支持。这意味着用户可以使用OpenID登录,第三方应用程序和服务可以使用OAuth对网站进行API调用并访问用户数据。

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

用户回答回答于

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

OAuth就是这样一种认证机制。作为一个OAuth提供者是伟大的,尽管规范有点难以掌握,特别是与签名有关的部分。一旦您有了OAuth,客户端应用程序通常很容易进行身份验证,因为有那么多“开放源代码,已经完成了,只是实现”库在大多数语言中可用。

OAuth的利弊已经争论了一段时间。

据我所知,OAuth的唯一真正替代方案是OAuth2.0和简单的基本身份验证。

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

扫码关注云+社区