我正在构建一个与Google URL Shortening API(Ruby)的集成。根据他们关于使用OAuth2进行身份验证的说明,您需要定义一个环境变量GOOGLE_APPLICATION_CREDENTIALS
,该变量是带有服务帐户凭据的JSON/P12文件的路径。
我想知道的是如何在不将凭据提交给源代码管理的情况下正确存储凭据。我可以选择使用凭据提交JSON文件,因为回购是私有的,但这闻起来很糟糕。
我在授权谷歌日历时遇到了同样的问题。
首先,让我澄清/重申这个问题,因为似乎存在一些混淆(即,它不像"设置环境变量"那么简单)。
背景
Google的应用程序默认凭据要求您设置一个环境变量GOOGLE_APPLICATION_CREDENTIALS
,该变量指向一个包含服务帐户凭据的JSON文件。
问题
我们设置环境变量的标准解决方案不适用于这种模式。我们需要在静态JSON文件中引用环境变量。那么我们该怎么做呢?
解决方案
事实证明,google auth库ruby的维护人员已经解决了这个问题。回顾源代码,你会发现你可以:
- 将
GOOGLE_APPLICATION_CREDENTIALS
设置为指向JSON文件 - 设置三个独立的环境变量:
GOOGLE_PRIVATE_KEY
、GOOGLE_CLIENT_EMAIL
和GOOGLE_ACCOUNT_TYPE
在选项2中,如果所有三个变量都存在,那么googleauthlibraryruby将处理其余的变量——不需要JSON文件。
Gotchas
- 如果使用上面的选项2,请确保未设置
GOOGLE_APPLICATION_CREDENTIALS
。如果设置了GOOGLE_APPLICATION_CREDENTIALS
,googleauthlibraryruby将支持它,选项2将不起作用 GOOGLE_PRIVATE_KEY
是一个多行秘密。设置多行配置变量可能很棘手(至少在Heroku上是这样)。例如,换行符(即n
)可能会由于双重转义而变得混乱。我必须遵循StackOverflow中的这些说明
您可以做的第一件也是最简单的事情就是设置环境变量。例如,我在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
。
随着env-var数量的增加,你可以使用一个名为dotenv的gem将它们保存在一个文件中,并自动加载它们-通过它们的自述文件,它们解释了如何不将其提交给你的repo,并且每个环境都有不同的凭据,以避免推送敏感信息。