共享 Google API 项目的客户端机密是否存在任何安全问题?

Are there any security concerns with sharing the client secrets of a Google API project?

我正在使用 YouTube 数据开展一个项目 API。我 运行 的 Python 脚本使用客户端机密 JSON 文件,我认为该文件用于验证帐户所有者。

如果我有有问题并需要帮助,公开分享这个是否有任何安全问题?如果将其私下保存在私人 github 存储库中是否还可以?

是的,这是一个问题。它被称为 "client secret" 是有原因的。如果它确实暴露了,您应该采取措施使它无效并获得一个新的,这样就不会有人试图冒充您。

简短回答:安全影响取决于秘密的类型,但是你应该分享它publicly 出于其他原因,包括 Terms of Service,其中声明:

You will keep your credentials confidential and make reasonable efforts to prevent and discourage other API Clients from using your credentials. Developer credentials may not be embedded in open source projects.

安全 影响取决于 type of client secret. You can tell the difference by whether the key in the JSON file is installed or web

Web 应用程序机密

如果客户端机密是 web 类型,那么是的:您绝对不应该 post 它,如果它被暴露则使其无效。这将允许恶意实体冒充您的后端并代表您对您用户的帐户执行操作。

已安装的应用程序机密

如果客户端机密是 installed 类型的机密,那么 私下共享 的问题就不那么大了,因为它不会授予 web 的各种能力application secret 确实如此,例如作为授予您的应用程序访问其数据的权限的用户进行身份验证的能力。正如 documentation 注释,"in this context, the client secret is obviously not treated as a secret."

仍然不应该post它public仅在GitHub、Stack Overflow问题或其他public地方,因为 posting 它 public 只会增加某人完整复制您的代码或以其他方式在他们自己的项目中使用您的客户机密的可能性,这可能会导致问题并且可能会 运行与 Terms of Service 发生冲突。试图重现您的问题的人可以很容易地生成凭据以放入您的代码中——凭据是一个合理的问题。

如果您勾选 Google Developer TOS 您在 Google 开发者控制台上创建帐户时同意的

您与任何人共享此文件是违反服务条款的。这是秘密的,仅供创建它的开发人员或开发人员团队使用。这与您从 Google 开发人员控制台或 google 云控制台下载的整个客户端机密 json 文件有关。

同样不要分享您的 google 秘密文件。无论接受的答案是什么,它可能会或可能不会有多大问题,它是什么类型的客户也不重要。共享客户端机密文件会破坏您同意的 TOS。

我对这个话题的另一个答案的更正

问题答案中有一些我非常不同意并认为可能会给开发人员带来困惑的陈述。首先让我说我不是 Google 的员工,我的评论是我自己的,并且来自我在 googles oauth / identity server 服务器工作八年以上并与 google 联系的经验身份团队。我担心上面答案中的某些信息可能会使某些开发人员感到困惑。与其说不要分享它们,不如说另一个问题错误地尝试了 IMO 来解释为什么分享它们不会那么糟糕。除了违反 googles TOS 的事实之外,我将解释为什么你应该 永远不要 分享它们。

The security implications depend on the type of client secret. You can tell the difference by whether the key in the JSON file is installed or web.

客户端类型对安全风险的大小没有影响。如果我们完全忽略什么构成安全风险的定义,只是说任何人都可以访问用户帐户或代表项目对用户进行身份验证的任何机会,都会构成很大的安全风险,那么就没有区别了.

使用以下命令我可以对自己进行身份验证我所需要的只是您项目的凭据文件

https://accounts.google.com/o/oauth2/auth?client_id={clientid}.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/analytics.readonly&response_type=code

对于已安装的应用程序,这仅在 100% 的时间内有效。如果我只是对自己的用户进行身份验证,为什么会这样不好。然后我可以使用我的邪恶力量向 API 发送如此多的请求,以至于目标 google 开发项目将被 Google 锁定以发送垃圾邮件。

如果我窃取了另一个用户的登录名和密码,我可以从您的 Google 开发者项目登录到他们,并且我可以访问他们的数据,Google 认为是您在黑他们。

由于重定向 URI,这对于 Web 应用程序来说有点困难,但是很多开发人员在开发时将添加 localhost 作为重定向 uri 而忘记将其删除(请不要将 localhost 作为重定向 uri当你自豪时)。因此,如果您在 Web 浏览器客户端中将重定向 URI 作为有效的重定向 URI,那么我可以做完全相同的事情。

请记住,我现在可以根据您的项目对用户进行身份验证,以访问我自己的大部分数据。但是,如果您还设置了对客户端数据的访问权限,例如通过 google 驱动器,我也可以访问它。 (注意:我不确定这个我还没有真正尝试过。)

如果我通过中间人攻击或其他方式获得用户刷新令牌,并且我有客户端机密文件,我现在可以访问用户数据,因为我可以使用我的刷新令牌创建新的访问令牌只要我愿意。这可能有点难以实现。

Web application secrets If the client secret is of the web type, then yes: you should absolutely not post it, and invalidate it if it gets exposed. This would allow a malicious entity to impersonate your backend and perform actions on your users' accounts on your behalf.

如上所述,只有当相关开发人员为本地主机打开重定向 uri 或者现在拥有您的客户端机密文件的人也可以访问您的 Web 服务器时,才会出现这种情况。一个非常重要的事实是,如果您让本地主机保持打开状态,我就可以使用您的凭据建立我自己的网站并进行设置,使其看起来与您的网站完全一样。然后,用户认为他们正在登录您的超棒应用程序,而实际上他们正在登录 Hacker 超级棒的应用程序,从而可以访问用户数据。又一次 google 认为是你在黑他们。

Installed application secrets If the client secret is an installed-type secret, then it's less problematic to share privately, as it doesn't grant the sorts of abilities a web application secret does, such as the ability to authenticate as users who grant your application permission to access their data. As the documentation notes, "in this context, the client secret is obviously not treated as a secret."

这完全是错误的已安装的应用程序提供与 Web 应用程序完全相同的权限关于 Oauth2 访问没有区别访问令牌是访问令牌,无论它是为已安装的应用程序还是为 Web 应用程序创建的.

如上所述,授予对已安装应用程序的访问权限会带来安全风险,这实际上更糟。由于已安装的应用程序没有重定向 uris。任何有权访问您的客户机密文件的人都可以对假设他们是您的用户进行身份验证,因为他们正在显示您的同意屏幕。不仅是您的 Google 开发者项目被劫持,而且您的用户认为他们正在对 Super awesome app 进行身份验证,实际上他们并没有授予窃取您凭据的人访问其数据的权限。

我想补充最后一件事。如果您将您的项目凭证提供给其他人。客户端机密 json 文件。您授予他们代表您拨打电话的权限。如果你有欺凌设置让我们说反对 google 地图 api。您需要为他们拨打的电话付费。

我希望这有助于消除与已接受的答案相关的一些混淆。