Ruby Google API OAuth 2.0如何存储应用程序默认凭据

Ruby Google API OAuth 2.0如何存储应用程序默认凭据,ruby,oauth-2.0,google-api,google-authentication,Ruby,Oauth 2.0,Google Api,Google Authentication,我正在构建一个与GoogleURL缩短API(Ruby)的集成。根据他们关于使用OAuth2进行身份验证的建议,您需要定义一个环境变量GOOGLE\u APPLICATION\u CREDENTIALS,该变量是使用服务帐户凭据指向JSON/P12文件的路径 我想知道的是如何正确地存储我的凭据,而不将它们提交给源代码管理。我可以选择提交带有凭据的JSON文件,因为repo是私有的,但这听起来像是一种糟糕的做法。您可以做的第一件也是最简单的事情是。例如,我在Mac上,因此我可以打开文件~/.bas

我正在构建一个与GoogleURL缩短API(Ruby)的集成。根据他们关于使用OAuth2进行身份验证的建议,您需要定义一个环境变量
GOOGLE\u APPLICATION\u CREDENTIALS
,该变量是使用服务帐户凭据指向JSON/P12文件的路径


我想知道的是如何正确地存储我的凭据,而不将它们提交给源代码管理。我可以选择提交带有凭据的JSON文件,因为repo是私有的,但这听起来像是一种糟糕的做法。

您可以做的第一件也是最简单的事情是。例如,我在Mac上,因此我可以打开文件
~/.bash\u profile
并添加
导出我的\u VAR=something
保存并关闭它。然后,获取文件以重新运行它,并执行导出
source~/.bash_profile
,或者简单地打开一个新的shell-该文件将自动获取以用于新的shell会话

现在,您可以在命令行中访问这些内容,如下面的
echo$MY_VAR
,它将在屏幕上打印
something
。在Ruby中,您可以通过
ENV
hash
put-ENV[“MY_-VAR”]
访问这些文件

托管提供商可以通过快捷方式将这些内容添加到服务器,例如Heroku:
Heroku config:set MY_VAR=something


随着您的环境变量数量的增加,您可以使用一个名为gem的工具将它们保存在一个文件中,并自动加载它们-通过它们的自述文件读取,他们解释了如何不将其提交到您的回购协议中,并且每个环境具有不同的凭据,以避免推送敏感信息。

我在授权Google Calendar时遇到了同样的问题

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

背景 谷歌希望您设置一个环境变量
Google\u APPLICATION\u CREDENTIALS
,该变量指向包含您的服务帐户凭据的JSON文件

问题 我们设置环境变量的标准解决方案不适用于这种模式。我们需要在静态JSON文件中引用环境变量。那我们怎么做呢

解决方案 原来的维护人员已经解决了这个问题,您将看到您可以:

  • GOOGLE\u应用程序\u凭据设置为指向JSON文件
  • 设置三个独立的环境变量:
    GOOGLE\u PRIVATE\u KEY
    GOOGLE\u CLIENT\u EMAIL
    GOOGLE\u ACCOUNT\u TYPE
  • 在选项2中,如果这三个变量都存在,那么将处理其余的变量–不需要JSON文件

    戈查斯
  • 如果使用上面的选项2,请确保未设置
    GOOGLE\u应用程序\u凭据。如果设置了
    GOOGLE\u应用程序\u凭据
    ,则用户将倾向于使用它,选项2将不起作用
  • GOOGLE_PRIVATE_KEY
    是一个多行密码。设置多行配置变量可能很棘手(至少在Heroku上是这样)。例如,换行符(即,
    \n
    )可能由于双重转义而出错。我不得不这么做

  • 谢谢,但这根本不能回答我的问题。我已经使用dotenv来存储凭据,但据我所知,您无法访问JSON文件中的环境变量。googleauth gem查找
    GoogleApplication\u CREDENTIALS
    环境变量,该变量是JSON文件的文件路径。我尝试在s3上托管该文件,但它不接受url。我不明白,听起来好像你说你在JSON文件中存储环境变量。您必须将其转换为shell的
    export VAR=stuff
    语法来设置它们,并且可以从代码中访问它们。关键是,你可以将这些从repo中删除,并在服务器上手动设置它们,以保持creds的私有性。我可以手动设置它们,是的,但是如何从JSON文件访问这些变量?正如我所解释的。将json文件中的变量转换为
    导出MY_VAR=stuff
    语法并转换为
    ~/.bash_profile
    并将其源代码后,您可以使用
    ENV[“MY_VAR”]
    从ruby访问它们。它们在shell中导出之前不是环境变量,但我不需要从Ruby应用程序访问它们。反正不是我的代码。我已经将它们定义为ENV变量,但这不是我需要帮助的地方。gem只关心
    GOOGLE\u APPLICATION\u CREDENTIALS
    变量,该变量是一个字符串,表示指向
    client\u secrets.json的路径,它是OAuth凭据的清单。将凭据导出为env变量对我没有任何好处,因为当gem从
    GOOGLE\u APPLICATION\u credentials
    读取文件时,它会尝试定义env变量,因此会覆盖我预先设置的任何env变量。