客户端或移动应用程序的安全 OAuth 2 流

信息安全 oauth 客户端 api 秘密分享
2021-08-14 05:59:22

我正在实现一个 API 和一个客户端 Web 应用程序,它们应该通过 API 进行通信并使用 OAuth 2 进行身份验证。

我无法克服我对什么是验证用户的正确方法的困惑(即没有重大安全疏忽)。

我收集了以下内容:

  • 理想情况下,您应该在 API 服务器上公开一个 Web 表单,该表单接受用户名和密码并使用授权代码重定向回来,以便在客户端交换访问令牌访问令牌。
  • 我描述的方法被认为很麻烦,因此 OAuth 2 提供了一个隐式流程,客户端应用程序发出一个包含 aclient_id和它收集的用户凭据的请求。它接收访问令牌。
  • 身份验证工具包似乎对只允许传递 持谨慎态度client_id,而是要求client_secret包含 。
  • 基于前一点,作为开发人员,您可能必须将您client_secret的应用程序嵌入到可分发的应用程序中,从而使其公开。
  • 一些了解 OAuth 2 的同行告诉我,开发人员将 OAuth 嵌入到他们的可分发产品中并不少见client_secret,一些知名服务(据称是 Twitter)也这样做。
  • 如果您在客户端和 OAuth 2 服务器之间添加代理以添加client_secret请求,它不会提高安全性,因为它类似于client_secret完全忽略。
  • 我发现与嵌入client_idclient_secret客户端相关的唯一安全问题是攻击者可能会实现他们自己的客户端,当给定用户凭据时,它可能代表用户行事。这似乎不是一种可能的攻击,因为网络钓鱼是相似的并且会产生更大的好处。

以下问题对我来说仍然没有答案:

  1. 客户端凭据流程资源所有者密码流程有什么区别我应该更喜欢哪一个?这个问题的答案并没有让我清楚地理解差异。
  2. 使用隐式流是否存在任何重大的安全问题,或者它是否可行?
  3. 是嵌入client_secret保险箱吗?
  • 如果没有,有什么替代方案?我应该仍然需要一个client_id,还是允许使用“公共”(未注册)客户?
2个回答

首先,让我们明确一件事——OAuth2 是授权,所以请记住这一点。

接下来让我们尝试进一步定义事物:

资源所有者

这些是您在想要授予对想要通过 FB 登录的 Snapchat 之类的访问权限时使用的凭据。

客户凭证

这是识别客户端的凭据,例如移动应用程序或浏览器内应用程序。例如,您不能将已批准的 Snapchat 访问权限与已批准的 Instantgram 访问权限一起使用。

示例

  • 您通过 FB 登录 Snapchat。
  • 您会被重定向到 FB 以验证和/或授权 Snapchat。该应用程序正在请求访问权限以访问您的资源(IE FB 配置文件)。
  • 您批准并且 Snapchat 将授权发送给 FB,这会为 Snapchat 提供访问令牌,然后它可以使用它来访问您的朋友列表。

隐式流的安全问题

有相关的安全顾虑。你可以SO 和Thread Safe上看到它的讨论。一般来说,这是一种可行的做法,您只需要考虑一些(您应该已经想到的)安全最佳做法。

最后,嵌入键

我建议你不要。我将您引导至有关确切问题的 Stormpath 博客条目。这主要围绕 JWT,但适用于 Oauth2。

将客户端密码保存在手机上并不安全,所以我将处理问题 3。

我没有解决方案,但我将解释一个替代方案,它可以降低将 client_secret 保存到移动设备中的风险。

您可以做的另一种选择是使用安装凭据而不是客户端凭据。客户端凭据将与安装凭据具有父关系。

客户端凭据 1
安装凭据 1
安装凭据 2 ....

这个想法是使用安全通道后端到后端来生成安装凭据。您将需要创建一个服务,在该服务中您会收到一个 APP 凭据并返回一个安装 ID。此外,移动应用程序所有者将需要创建用户请求安装凭证的服务。

基本上,

移动应用程序 -> 后端(移动应用程序拥有)--> 后端(OAuth 所有者)

此解决方案不能解决您的问题,但可以降低泄露机密的风险。您将获得安装凭据,并可以在您的 OAuth 流程中使用它。如果有人得到了这个秘密,它只能冒充一个用户。攻击不会扩大。