【问题标题】:Google API OAuth 2.0 how to store Application Default CredentialsGoogle API OAuth 2.0 如何存储应用程序默认凭据
【发布时间】:2016-03-25 11:26:01
【问题描述】:

我正在构建与 Google URL Shortening API(在 Ruby 中)的集成。根据他们关于使用 OAuth2 进行身份验证的 instructions,您需要定义一个环境变量 GOOGLE_APPLICATION_CREDENTIALS,它是带有您的服务帐户凭据的 JSON/P12 文件的路径。

我想知道的是如何在不将其提交到源代码控制的情况下正确存储我的凭据。我可以选择使用凭据提交 JSON 文件,因为 repo 是私有的,但这听起来像是不好的做法。

【问题讨论】:

    标签: ruby oauth-2.0 google-api google-authentication


    【解决方案1】:

    您可以做的第一件事也是最简单的事情是set environment variables。例如,我在 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 的 gem 将它们保存在一个文件中并自动加载它们 - 阅读它们的自述文件,它们解释了如何不将其提交到您的存储库并有不同的每个环境的凭据,以避免推送敏感信息。

    【讨论】:

    • 谢谢,但这并不能真正回答我的问题。我已经使用 dotenv 来存储凭据,但据我所知,您无法访问 JSON 文件中的环境变量。 googleauth gem 查找 GOOGLE_APPLICATION_CREDENTIALS 环境变量,它是 JSON 文件的文件路径。我尝试在 s3 上托管文件,但它不接受 url。
    • 我不明白,听起来您是在说您将环境变量存储在 JSON 文件中。您必须将其转换为 export VAR=stuff 语法,以便 shell 设置它们并可以从您的代码中访问。关键是您可以将这些从您的存储库中删除并在您的服务器上手动设置它们以保持凭据的私密性。
    • 我可以手动设置它们,是的,但是如何从 JSON 文件中访问这些变量?
    • 正如我所解释的那样。一旦您将 json 文件中的变量转换为 export MY_VAR=stuff 语法到您的 ~/.bash_profile 并获取它,您就可以使用 ENV["MY_VAR"] 从 ruby​​ 访问它们。在 shell 中被 exported 之前,它们不是环境变量。
    • 但我不需要从 Ruby 应用程序访问它们。反正不是来自我的代码。我已经将它们定义为 ENV 变量,但这不是我需要帮助的。 gem 只关心GOOGLE_APPLICATION_CREDENTIALS 变量,它是一个字符串,表示client_secrets.json 的路径,它是OAuth 凭据的清单。将凭据导出为 env 变量对我没有任何好处,因为当 gem 从 GOOGLE_APPLICATION_CREDENTIALS 读取文件时,它会尝试定义 env 变量,因此会覆盖我事先设置的任何 env 变量。
    【解决方案2】:

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

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

    背景

    Google 的 Application Default Credentials 要求您设置一个环境变量 GOOGLE_APPLICATION_CREDENTIALS,它指向一个包含您的服务帐户凭据的 JSON 文件。

    问题

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

    解决方案

    原来google-auth-library-ruby 的维护者已经解决了这个问题。 Reviewing the source code,你会发现你可以:

    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)可能由于双重转义而变得混乱。我必须follow these instructions from StackOverflow

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2018-05-23
      • 2015-05-23
      • 1970-01-01
      • 2019-01-23
      相关资源
      最近更新 更多