什么可以防止其他应用窃取我的 Google OAuth 客户端 ID?

Gre*_*ens 7 android google-oauth appauth

我创建了一个 Android 应用程序,它使用 AppAuth 通过 Google OAuth 进行身份验证。在 Google Cloud Platform Console 中,我为我的应用程序创建了一个 Android OAuth 2.0 客户端 ID,并提供了应用程序包名称和签名证书指纹。一切正常。

我想验证只有我的应用程序可以使用该客户端 ID。因此,我使用不同的包名称创建了第二个应用程序,并使用不同的签名证书对其进行了签名。使用相同的客户端 ID,我仍然能够通过 Google 进行身份验证并访问 API。我认为情况不应该如此。我正在查看 AppAuth 的源代码,它看起来在身份验证流程中从未使用过应用程序签名或包名称。当然,它使用 PKCE,但我预计会发生更多事情。

因此,如果我可以轻松窃取自己的客户端 ID,那么如何阻止其他人从我的 APK 中提取我的客户端 ID 并将其用于身份验证呢?根据我的包名称,我用于重定向 URI 的自定义方案很容易找出。因此,rouge 应用程序可以将 AppAuth 配置为使用类似的重定向 URI 并捕获授权结果。而且由于 PKCE 仅用于验证来自同一位置的授权请求和代码交换,因此恶意应用程序会同时执行这两项操作,因此也没有真正的保护。

我可以将客户端 ID 类型切换为 Web 或其他,但这需要我使用客户端密钥,如果将其嵌入到应用程序中,这同样不安全。

我是否遗漏了什么,或者 Google OAuth 是否完全按照预期工作?

Joh*_*ley 3

对于客户端 Google OAuth 2,您的客户端 ID 并不重要。客户端执行 OAuth 流程并且客户端接收 OAuth 令牌。神奇的是,客户必须授权Google。任何人都可以窃取您的客户 ID,但他们不能用它做任何事情。作为 OAuth 生命周期的一部分,您应该验证 OAuth 令牌。您的后端不应该盲目地接受来自客户端或不受您绝对控制的任何地方的任何内容。

您的客户端 ID 不是秘密,您可以将其明确地写入代码中。

这是必须保密的客户端秘密。客户端密钥不参与客户端身份验证。客户端密钥用于您的后端服务器。

我认为你混淆了这个过程。当客户端应用程序(您的应用程序、网络浏览器等)使用 Google 帐户进行身份验证时,您的应用程序未获得授权。客户端正在被授权。客户应正确判断他们访问的网站(或应用程序)并使用他们的 Google 登录信息。客户端可以用其令牌做的唯一事情就是访问自己的数据(Google Drive、Gmail 等)。如果您的后端服务器接受客户端的 OAuth 令牌来管理访问,那么您有责任验证该令牌及其在您的系统上的所需用途以及该令牌的授权者。

更好的选择是在后端(例如您的 Web 服务器)执行身份验证和授权。然后,您可以实施 Google OAuth 重定向,将 OAuth 令牌发送到您的服务器。您受到保护,因为只有授权来源(例如您的域名)和授权重定向 URI(Web 服务器上的端点)才能参与身份验证过程。然后,您将令牌存储在客户端会话中,必要时更新,根据需要添加授权范围等。

我经常使用这两种方法(客户端、服务器端)并且效果都很好。

  • 第一个问题是一个有效的问题,这个答案没有回答它,所以我否决了它。正如 @GregMoens 所说,我可以窃取他的客户端 ID 并在我自己的 OAuth 应用程序中使用它,假装是他的应用程序。用户就会信任*我*,而事实上我不是 Google 批准的应用程序。传统上,“client_secret”应该保证我是客户端应用程序的所有者,但正如最初的问题所述,PKCE 不使用“client_secret”。通过“使用服务器授权而不是 PKCE”来回答问题并不是一个有效的答案,并且忽略了 PKCE 最初诞生的原因。 (7认同)
  • 我同意@ashiina 的观点。我正在实现自己的 OAuth2 服务器,客户端密钥通常是抵御攻击者的主要堡垒。在移动设备上,没有客户端密钥,并且无法安全地验证深层链接的重定向 URI。PKCE 也不是答案,因为它无法阻止使用其他开发人员的客户端 ID 的攻击者在登录后访问甚至控制用户的私人信息。是的,用户需要提高安全意识,但是这并不是驳回 OAuth2 流程中明显漏洞的借口,该流程旨在保护用户信息的安全。 (3认同)
  • 就我的具体情况而言,我没有网络服务器。移动应用程序进行身份验证,然后直接访问 Google API,并直接在应用程序中显示数据。如果另一个应用程序使用了我的客户端 ID,它会将该 API 活动链接回我的 Google Cloud 项目,这意味着会对我产生计费影响。这是我最担心的。这会改变事情吗? (2认同)