在 Java 应用程序中包含 OAuth client_secret 文件

信息安全 oauth 谷歌
2021-08-30 00:44:23

client_secret.json在 Google Drive API 的 OAuth 2.0 授权流程中使用了一个文件(示例)。

如果我包含client_secret.json在我的 Java 应用程序中,访问 JAR 内容非常容易。那么,我应该担心吗?我没有办法让这个文件“秘密”。

使用这些信息可以做些什么错误?最终用户必须授予对我的应用程序的访问权限才能访问他的Google Drive 文件。


更新:似乎可以分析两种情况。

  • 只能用 做什么client_secret.json

这是我第一个问题的意图。我唯一能想到的是,如果用户将他的帐户链接到我的应用程序,它可能会耗尽我的 Drive API 的免费配额(每天 1,000,000,000 个请求)。

  • 有人访问存储的用户凭据(StoredCredential在示例中为文件)加上client_secret.json.

我想这是最坏的情况,因为“某人”可以在用户帐户中充当我的应用程序。


更新 2:可在此处找到 Google 文档:将 OAuth 2.0 用于已安装的应用程序

从 Developers Console 获得的客户端 ID 和客户端密码嵌入在应用程序的源代码中。在这种情况下,客户端机密显然不被视为机密

1个回答

您不应在 javascript/desktop/mobile 应用程序中包含客户端密码

原因是,就像你说的,它很容易访问。如果您将其嵌入到您的应用程序中,您将无法保护它。一旦攻击者找到您的客户机密,他现在就可以冒充您的客户。客户端密码仅用于包含在 Web 服务器上。

使用 OAuth2 隐式流

OAuth2 隐式流程是专门为解决这个问题而设计的。在隐式流程中,没有客户端密码,一旦用户通过 OAuth2 提供者进行身份验证,客户端将直接接收访问令牌,因此不需要客户端密码。

https://www.rfc-editor.org/rfc/rfc6749#section-1.3.2

不要使用隐式流进行身份验证

OAuth2 是为授权而构建的,这与身份验证不同。如果您需要身份验证,则需要查看构建在 OAuth2 之上的 Open ID Connect,以提供安全身份验证所需的所有缺失部分。

关于安全

虽然建议在使用 javascript/桌面/移动客户端时使用隐式流程,但主要是为了方便减少所需的往返次数。由于您无法保护客户端机密,因此没有理由包含它。

删除客户端密钥(以及与其相关的额外步骤)的一个缺点是客户端无法再知道令牌是否是为他颁发的,因为令牌未绑定到特定客户端。这会导致网络钓鱼攻击的多重机会,如下所述:

https://www.rfc-editor.org/rfc/rfc6749#section-10.16