谷歌API OAuth 2.0如何存储应用程序默认凭据

4
我正在使用Ruby开发与Google URL缩短API的集成。根据他们有关OAuth2身份验证的说明,您需要定义一个环境变量GOOGLE_APPLICATION_CREDENTIALS,该变量是指向包含服务帐户凭据的JSON/P12文件的路径。
我想知道如何在不将凭据提交到源代码控制中的前提下正常存储我的凭据。因为仓库是私有的,所以我可以选择提交包含凭据的JSON文件,但这似乎并不是良好的实践。
2个回答

5

当我授权Google日历时,我遇到了同样的问题。

首先,让我澄清/重申问题,因为似乎有些混淆(即它不像“设置环境变量”那么简单)。

背景

Google的应用程序默认凭据希望您设置一个名为GOOGLE_APPLICATION_CREDENTIALS的环境变量,该变量指向包含您的服务帐户凭据的JSON文件。

问题

我们通常解决方案中设置环境变量的方法在这种模式下不起作用。 我们需要以某种方式在静态JSON文件中引用环境变量。 那么我们该怎么做呢?

解决方案

事实证明,google-auth-library-ruby的维护者已经解决了这个问题。 审查源代码, 您将看到您可以:

  1. GOOGLE_APPLICATION_CREDENTIALS设置为指向JSON文件。
  2. 设置三个单独的环境变量:GOOGLE_PRIVATE_KEYGOOGLE_CLIENT_EMAILGOOGLE_ACCOUNT_TYPE

在选项2中,如果所有三个变量都存在,google-auth-library-ruby会处理剩下的部分 - 不需要JSON文件。

要注意的事项

  1. 如果您使用上述选项2,请确保未设置GOOGLE_APPLICATION_CREDENTIALS。如果设置了GOOGLE_APPLICATION_CREDENTIALSgoogle-auth-library-ruby将优先考虑它,选项2将无法工作。
  2. GOOGLE_PRIVATE_KEY是一个多行密钥。设置多行配置变量可能会很棘手(至少在Heroku上是这样)。例如,由于双重转义,换行符(即\n)可能会出现问题。我不得不按照StackOverflow的说明进行操作

0

你可以做的第一件 - 也是最简单的 - 事情是设置环境变量。例如,我在Mac上,所以我可以打开文件~/.bash_profile并添加export MY_VAR=something保存并关闭它。然后,源文件以重新运行它并执行导出source ~/.bash_profile或者只需打开一个新的shell - 该文件会自动为新的shell会话进行源操作。

现在,您可以像这样在命令行中访问它们echo $MY_VAR,这将在屏幕上打印something。在Ruby中,您可以通过ENV哈希访问它们puts ENV["MY_VAR"]

托管提供商有快捷方式将这些添加到您的服务器中,例如Heroku:heroku config:set MY_VAR=something

随着您的环境变量数量增加,您可以使用一个名为dotenv的宝石来将它们保存在文件中并自动加载它们 - 请阅读它们的自述文件,他们解释了如何不将其提交到您的存储库中,并拥有每个环境的不同凭据,以避免推送敏感信息。

谢谢,但这并没有真正回答我的问题。我已经使用dotenv来存储凭据,但据我所知,您无法在JSON文件中访问环境变量。googleauth gem寻找GOOGLE_APPLICATION_CREDENTIALS环境变量,它是指向JSON文件的文件路径。我尝试将文件托管在s3上,但它不接受URL。 - Daniel Bonnell
我不明白,你好像在说你正在将环境变量存储在JSON文件中。你必须将其转换为export VAR=stuff语法,以便shell设置它们并从代码中访问。关键是你可以将这些内容从repo中删除,并在服务器上手动设置它们,以保持凭据的私密性。 - DiegoSalazar
就像我所解释的那样。一旦你将json文件中的变量转换为 export MY_VAR=stuff 语法并写入 ~/.bash_profile 并 source 它,你就可以通过 ENV["MY_VAR"] 在Ruby中访问它们。只有在shell中被导出(export)后,它们才是环境变量。 - DiegoSalazar
但是我不需要从Ruby应用程序中访问它们。无论如何,我已经将它们定义为ENV变量,但这不是我需要帮助的地方。该gem只关心GOOGLE_APPLICATION_CREDENTIALS变量,它是表示client_secrets.json路径的字符串,该文件是OAuth凭据清单。将凭据导出为env变量对我没有任何好处,因为当gem从GOOGLE_APPLICATION_CREDENTIALS读取文件时,它会尝试定义env变量,并因此覆盖我之前设置的任何env变量。 - Daniel Bonnell
此外,事后设置也无济于事,因为如果 gem 无法获取凭据生成 oauth 令牌,它将已经引发了异常。 - Daniel Bonnell
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接