oauth - 共享 Google API 项目的客户端机密是否存在任何安全问题?
问题描述
我正在使用 YouTube 数据 API 开发一个项目。我正在运行的 Python 脚本使用客户端机密 JSON 文件,我认为该文件用于验证帐户所有者。
如果我遇到问题并需要帮助,公开分享此内容是否存在安全问题?如果它被私下保存在私人 github 存储库中是否还可以?
解决方案
如果您查看您在 Google 开发者控制台上创建帐户时同意的Google Developer TOS
您与任何人共享此文件是违反 TOS 的。这是秘密的,仅适用于创建它的开发人员或开发人员团队。这与您从 Google 开发人员控制台或 Google 云控制台下载的整个客户端机密 json 文件有关。
再次不要分享您的谷歌秘密文件。不管接受的答案是什么,它可能有问题或没有问题,它是什么类型的客户也无关紧要。共享客户端机密文件将破坏您同意的 TOS。
我对这个线程的另一个答案的更正here
有问题的答案有一些我强烈不同意的陈述,并认为可能会给开发人员造成混淆。首先让我说我不是谷歌的员工,我的评论是我自己的,并且来自我在谷歌 oauth / 身份服务器服务器工作八年以上并与谷歌身份团队联系的经验。我担心上面答案中的某些信息可能会使一些开发人员感到困惑。IMO 试图错误地解释为什么分享它们不会那么糟糕,而不是仅仅说不要分享它们。我将解释为什么你不应该分享它们,除了它反对谷歌服务条款。
安全隐患取决于客户端机密的类型。您可以通过 JSON 文件中的密钥是安装的还是 web.xml 来区分。
客户端的类型对我的安全风险有多大没有影响。如果我们完全忽略什么构成安全风险的定义,而只是说任何人有机会代表项目访问用户帐户或验证用户身份,都会构成很大的安全风险,那么就没有区别.
使用以下命令,我可以验证自己,我需要的只是您项目的凭据文件
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 认为是您在入侵他们。
由于重定向 URI,这对于 Web 应用程序来说有点困难,但是许多开发人员在开发时将 localhost 添加为重定向 uri 并忘记将其取出(当您感到自豪时,请不要将 localhost 作为重定向 uri ) . 因此,如果您在 Web 浏览器客户端中将重定向 URI 作为有效的重定向 URI,那么我可以做同样的事情。
请记住,我现在能够根据您的项目对用户进行身份验证,以访问我自己的数据。但是,如果您还设置了对客户数据的访问权限,例如通过谷歌驱动器,我也可以访问它。(注意:我不确定这个我还没有真正尝试过。)
如果我已经通过中间人攻击或其他方式获取用户刷新令牌,并且我有客户端机密文件,我现在可以访问用户数据,因为我可以使用我的刷新令牌创建新的访问令牌,只要我想。这可能有点难以实现。
Web 应用程序机密 如果客户端机密是 Web 类型,那么是的:您绝对不应该发布它,如果它被暴露,它就会失效。这将允许恶意实体冒充您的后端并代表您对用户帐户执行操作。
如上所述,只有当相关开发人员为 localhost 打开重定向 uri 或现在拥有您的客户端机密文件的人也可以访问您的 Web 服务器时,才会出现这种情况。一个非常重要的事实是,如果您打开本地主机,我可以使用您的凭据建立自己的网站并进行设置,使其看起来与您的网站完全一样。用户然后认为他们正在登录您的超级棒的应用程序,而实际上他们正在登录黑客超级棒的应用程序,让他们可以访问用户数据。谷歌再次认为是你在黑他们。
已安装的应用程序机密 如果客户端机密是已安装类型的机密,那么私下共享的问题会更小,因为它不会授予 Web 应用程序机密所具有的各种能力,例如作为授予您的应用程序的用户进行身份验证的能力访问他们的数据的权限。正如文档所述,“在这种情况下,客户端机密显然不被视为机密。”
这是完全错误的 已安装的应用程序提供与 Web 应用程序完全相同的权限,对于 Oauth2 访问没有区别,无论它是为已安装的应用程序还是 Web 应用程序创建的,访问令牌都是访问令牌。
如上所述,授予对已安装应用程序的访问权限的安全风险实际上更糟。由于已安装的应用程序没有重定向 uri。任何有权访问您的客户端机密文件的人都可以对假设他们是您的用户进行身份验证,因为他们正在显示您的同意屏幕。不仅您的 Google 开发人员项目被劫持,而且您对那些认为他们正在对 Super Awesome 应用进行身份验证的用户而言,您的声誉也被劫持,实际上他们并未授予窃取您凭据的人访问其数据的权限。
我想补充最后一件事。如果您向其他人提供您的项目凭据。客户端机密 json 文件。您授予他们代表您拨打电话的权限。如果您设置了欺凌,可以说反对 google maps api。您需要为他们拨打的电话付费。
我希望这有助于消除与接受的 anwser 相关的一些混淆。
推荐阅读
- python - OpenCV中的色块检测和标记
- pycharm - 如何让 PyCharm 了解某些文件/目录被排除在覆盖范围之外?
- javascript - 如何为新元素添加样式并在创建时将其删除
- ruby-on-rails - FactoryGirl:访问特征内的关联数据
- angular - ng-select [items] 绑定获取选项太多次
- variables - 在 zsh 中使用变量作为命令参数
- flutter - 颤振:使用 RefreshIndicator 时没有刷新指示器
- typescript - 安装最新的打字稿后仍然看到旧版本的打字稿
- swift - 在 Swift 中反转链表
- docker - 在单独的 docker compose 文件之间共享卷