在使用OAuth2的“资源所有者密码凭据”授予类型时,如何对客户端凭据进行保密


75

我们正在建立一个休息服务,我们想使用OAauth 2进行授权。在目前的草案(5月19日v2-16)描述了4种类型。它们是用于获得授权(访问令牌)的机制或流程。

  1. 授权码
  2. 隐性补助金
  3. 资源所有者凭证
  4. 客户凭证

似乎我们需要支持它们全部四个,因为它们有不同的用途。前两个(可能还有最后一个)可以从需要访问API的第三方应用程序中使用。授权代码是对足以幸运地驻留在安全服务器上的Web应用程序进行授权的标准方式,而隐式授予流将是无法完全对其凭据保密的客户端应用程序(例如,移动/台式机)的选择。应用程序,JavaScript客户端等)。
我们希望自己使用第三种机制,以在移动设备上提供更好的用户体验–而不是将用户带到Web浏览器中的登录对话框等,用户只需在应用程序中直接输入其用户名和密码即可。并登录。我们还希望使用“客户端凭据”授予类型来获取访问令牌,该访问令牌可用于查看公共数据,而不与任何用户相关联。在这种情况下,这与其说是授权,不如说是类似于API密钥的一种,我们仅用于授予对已向我们注册的应用程序的访问权限,并为我们提供了在需要时撤消访问权限的选项。

所以我的问题是:

  1. 您认为我正确理解了不同赠款类型的目的吗?
  2. 您如何对客户凭证保密?在第三种情况和第四种情况下,我们都需要在客户机上的某个位置具有客户机ID和客户机密钥,这听起来不是一个好主意。
  3. 即使您使用隐式授予类型并且不公开您的客户端机密,是什么阻止另一个应用程序使用相同的授权机制和您的客户端ID来模拟您的应用程序?

总而言之,我们希望能够使用来自客户端应用程序的客户端凭据和资源所有者凭据流。这两个流程都要求您以某种方式存储客户端机密,但是客户端是移动或JavaScript应用程序,因此很容易被盗。

Answers:


55

我面临着类似的问题,并且对于OAuth来说还比较陌生。我已经在我们的API中实现了“资源所有者密码凭据”,供我们的官方移动应用程序使用-网络流量似乎非常可怕,无法在移动平台上使用,并且一旦用户安装了应用程序并获得信任这是我们的官方应用,他们应该可以轻松地直接在应用中输入用户名/密码。

正如您所指出的,问题是我的API服务器无法安全地验证应用程序的client_id。如果我在应用程序代码/程序包中包含client_secret,那么安装该应用程序的任何人都可以看到它,因此,要求client_secret不会使该过程更加安全。因此,基本上,任何其他应用程序都可以通过复制client_id来模拟我的应用程序。

只是为了直接回答您的每一点:

  1. 我一直在重新阅读规范的不同草案,以查看是否有任何更改,并且主要关注“资源所有者密码凭证”部分,但是我认为您是对的。客户凭证(4)我认为,内部或第三方服务也可能会使用它们,它们可能需要访问的不仅仅是“公共”信息,例如您可能具有分析能力或需要获取所有用户信息的东西。

  2. 我认为您不能对客户保密。

  3. 没有什么可以阻止其他人使用您的客户ID。这也是我的问题。一旦代码离开服务器并作为应用程序安装或在浏览器中以Javascript运行,您就无法假设任何秘密。

对于我们的网站,我们遇到的问题与您使用“客户端凭据”流程描述的问题类似。我最终要做的是将身份验证转移到服务器端。用户可以使用我们的Web应用程序进行身份验证,但是我们API的OAuth令牌存储在服务器端,并且与用户的Web会话相关联。Javascript代码发出的所有API请求实际上都是对Web服务器的AJAX调用。因此,浏览器不直接通过API进行身份验证,而是具有经过身份验证的网络会话。

客户端凭据的用例似乎有所不同,因为您正在谈论第三方应用程序,并且仅通过此方法提供公共数据。我认为您的担心是正确的(任何人都可以窃取和使用其他人的API密钥),但是如果您只需要免费注册就可以获取API密钥,那么我不明白为什么有人会真正想要窃取一个。

您可以监视/分析每个API密钥的使用,以尝试检测滥用情况,这时您可以使一个API密钥无效并为合法用户提供一个新的API密钥。这可能是最好的选择,但绝不是安全的。

如果您想将其锁定得更紧一点,也可以使用类似“刷新令牌”的方案,尽管我不知道您将获得多少收益。如果您每天使暴露于Javascript的api令牌过期一次,并且要求第三方使用(秘密)刷新令牌进行某种服务器端刷新,则被盗的api令牌永远不会超过一天。可能会鼓励潜在的令牌窃贼改而注册。但是,其他所有人都会感到痛苦,因此不确定是否值得。


2
我做了更多的研究,我认为您是对的-无法对客户保密。正如您所建议的那样,保护API免受滥用的最佳选择似乎是实施某种使用情况监视。感谢您的回答!
Georgi Stoyanov

如果您将来遇到任何更好的解决方案,请告诉我!
heavi5ide 2011年

3
为了理解,以下主张正确吗?*当您使用经过身份验证的Web会话(通过cookie或类似方式)并在服务器上以“旧方式”进行身份验证时,没有比使用OAuth2的“资源所有者密码凭据”授予类型更高的安全性,因为这也是经典的Web会话/ cookie可能会转移给其他演员/可能被盗。
spaudanjo

1
你们中有没有人找到这些问题的解决方案?似乎当我打开“资源所有者凭据”(最佳移动用户体验)流时,任何应用程序都可以使用该流,而我的身份验证服务器将无法知道第一方和第三方应用程序之间的区别。
Jarrod 2014年

4
我不知道Facebook,Twitter和其他规模较小但非常大的社交网络公司如何在其移动应用程序中解决此问题……
Stefano Mondino 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.