“私有”REST API的安全性

时间:2012-02-14 16:14:17

标签: api authentication rest oauth-2.0

我目前正在开发一个Web应用程序,它现在由一个前端组成,它使用我们编写的REST API显示数据并与之交互。唯一能使用API​​的是我们的前端网站,在某些时候我们将开发一个移动应用程序。

我已经做了很多关于OAuth如何成为保护API的理想机制的阅读,在这一点上,我开始很好地理解它是如何工作的。

我的问题是 - 因为我永远不会授予第三方客户端访问API的权限,所以OAuth真的有必要吗?它有什么理由有利吗?此外,因为后端只是API,所以没有用户进行身份验证的网关(如果您使用Twitter API编写应用程序,当用户进行身份验证时,他们将被定向到Twitter页面以授予访问权限)然后重定向回客户端)。

我不确定要进入哪个方向。似乎http身份验证和OAuth之间必须有一些方法适合这种情况,但我只是没有得到它。

4 个答案:

答案 0 :(得分:1)

从我的观点来看,其中一个支持OAuth而不是其他选项的方案是与不受信任的客户合作,无论这些客户是由您还是第三方开发的。

什么是不受信任的客户?从谁处理授予您API访问权限的凭据开始思考。

  • 例如,您的网络应用程序可以在两个虚拟环境中与您的API进行交互:

    1. 您的网络应用服务器端与您的API进行对话。您的网络应用服务器是受信任的客户端,因为访问您的API的凭据只能由谁访问服务器...您和您的团队。您可以使用client_id和client_secret对Web应用服务器进行身份验证。
    2. 您可能希望从使用JavaScript在最终用户浏览器上运行的Web应用客户端直接拨打API。最终用户的浏览器是不受信任的客户端。如果您要将凭据交付给浏览器,那么任何人都可以查看JavaScript代码并窃取您的凭据。
  • 第三方Native App也不受信任。使用您的API的恶意开发人员可以保存您平台的凭据和最终用户。

  • 您的原生应用程序是受信任的客户端,可以使用简单的用户名,密码和标识您的应用程序的客户端ID来管理身份验证。

OAuth如何提供帮助? OAuth Authorization codeImplicit拨款可以帮助您解决此问题。这些流程仅适用于支持重定向的客户端,如浏览器。并允许您针对授权服务器对不受信任的客户端和用户进行身份验证,以获取对资源服务器(API)的访问权限,而无需公开凭据。看看RFC,了解它是如何完成的。

OAuth的好处在于它不仅支持这些基于重定向的身份验证流,还支持客户端凭据授予和用户凭据授权。因此,OAuth授权服务器将涵盖所有情况。

答案 1 :(得分:1)

OAuth 2.0最初看起来像是一个PITA,如果你想要自己构建很多,但是大多数语言都有一些非常可靠的OAuth 2.0设置,你可以用不同的数量来摆弄它们。如果您正在使用像Laravel或RoR这样的框架,那么它几乎没有任何工作。

如果您不想按照帖子中的建议重定向用户,请忽略其他有关两条腿流量的评论和答案。您可以使用client_credentials授权类型让应用程序只提供其客户端ID和密码以换取访问令牌,这很简单。

我会问我们有多私密,因为如果与它交谈的唯一系统是在后端并且没有与外界的互动,那么你可能会把它打开,只是依靠网络来保证它的安全( VPN /防火墙)。

但如果它是"我们的iPhone应用程序使用它"那么你肯定想要使用OAuth 2.0,或类似的东西。

答案 2 :(得分:0)

2腿OAuth可能就是您想要使用的。它基本上是对共享密钥进行哈希处理,但您的优势在于无需自己编写代码。

以下是相关问题:Two-legged OAuth - looking for information

答案 3 :(得分:0)

您应该将Oauth用于移动设备与API层通信。

但是,这个Web UI层中的Oauth对中间层访问(机器到机器)没有任何好处。

另一方面,存在一些潜在的问题

  1. 管理访问令牌到期变得很痛苦。请考虑您的UI必须在群集中的多个节点之间缓存访问令牌。在过期时刷新它,并且UI层与后端协商安全性的事实将偶尔花费额外的时间。

  2. 在两条腿的Oauth(OAuth Client Credential,如在v2.0中)不支持任何加密。因此,您仍然需要将密钥和密钥发送到服务器以获取访问令牌。

  3. 后端必须实现发布访问令牌,刷新令牌,验证访问令牌等,没有任何明显的好处