如何在没有默认凭据文件的情况下授权Google服务帐户?

djb*_*djb 10 ruby oauth heroku google-api-ruby-client

我有一个Google服务帐户,我的应用可以使用该帐户从Google Analytics中检索数据.

当我创建帐户时,我下载了一个client_secrets文件,其中包含通过OAuth授权的所有必要信息,我在一个环境变量中记录了该文件的路径,该变量GOOGLE_APPLICATION_CREDENTIALS根据Google的文档进行了调用.

我现在可以得到这样一个经过身份验证的客户端:

authorization = Google::Auth.get_application_default(scopes) 
Run Code Online (Sandbox Code Playgroud)

此方法从文件中读取凭据,该凭据在本地运行,但我的应用程序托管在Heroku上,无法进行文件存储.

文档说明我可以提供此文件(不能),在官方Google服务上运行我的应用程序(不会),或者遇到错误.

如何在没有该client_secrets文件的情况下验证我的服务帐户?

djb*_*djb 21

我在gem 的源代码中找到了答案google-auth-library-ruby.

事实证明,还有另一种选择:从取值client_secrets文件并把它们放在命名的环境变量GOOGLE_ACCOUNT_TYPE,GOOGLE_CLIENT_ID,GOOGLE_CLIENT_EMAILGOOGLE_PRIVATE_KEY分别.

如果填充了这些密钥,则将从那里加载凭据.不过,在文档中并不是这样的耳语.


Mig*_*Mac 7

由于这是在谷歌搜索“谷歌服务凭证红宝石”时返回的主要结果之一,我想我会将我最近的经验添加到可能的答案列表中。

虽然您可以执行第一个答案中提到的方法,但我找到了一种与 Heroku 配合良好的替代解决方案。我知道在另一篇文章中已经提到了这一点,但遗漏的关键是如何正确存储完整的 GOOGLE_APPLICATION_CREDENTIALS .json 文件,以便它可以全部保存在 Heroku 上的一个环境中,并且不会有特殊字符炸毁您的应用程序当尝试

我详细说明了我的步骤如下:

  1. 按照此处 Google 的说明获取 GOOGLE_APPLICATION_CREDENTIALS json 文件:身份验证入门
  2. 当然,这将包含一个 json 对象,其中包含 Heroku 不需要的所有空格、换行符和引号。因此,删除所有空格和换行符...并注意此处 ->除了“开始私钥”段中的换行符之外。基本上把json变成一长串。使用您觉得舒服的任何方法。
  3. 一旦您拥有删除了空格和换行符的单行 json 文件,您将需要通过运行以下命令将其添加到 Heroku:

    heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< /Users/whoever/Downloads/[CREDENTIAL_JSON_FILENAME].json)" --app your-app
    
    Run Code Online (Sandbox Code Playgroud)
  4. 对于我的情况,我需要在初始化时提供可用的服务帐户,因此我将其放置在 Rails 应用程序的初始化程序中:

    GOOGLE_SERVICE_ACCOUNT_CREDENTIALS=Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: StringIO.new(ENV['GOOGLE_APPLICATION_CREDENTIALS'])
    )
    
    Run Code Online (Sandbox Code Playgroud)

注意StringIO.new()方法。想要#make_creds一个文件。因此,通过使用 来伪造它StringIO.new

这个方法效果很好。

如果您需要它在本地计算机上以不同的方式工作,您始终可以将 .json 存储在项目中的某个位置,并通过文件位置字符串引用它。这是我的完整初始化程序:

require 'googleauth'

#https://www.rubydoc.info/github/google/google-auth-library-ruby/Google/Auth/ServiceAccountCredentials 
if Rails.env == "test"
  GOOGLE_SERVICE_ACCOUNT_CREDENTIALS = 
Google::Auth::ServiceAccountCredentials.make_creds(
    json_key_io: File.open('lib/google/google_application_credentials.json')
  ) 
elsif Rails.env != "development"
    GOOGLE_SERVICE_ACCOUNT_CREDENTIALS = 
Google::Auth::ServiceAccountCredentials.make_creds(
    json_key_io: StringIO.new(ENV['GOOGLE_APPLICATION_CREDENTIALS'])
  ) 
end
Run Code Online (Sandbox Code Playgroud)

如果您使用像 dotenv 这样的 gem,您可以将格式化的 json 字符串存储为 ENV,或者您可以只引用 ENV 中的文件位置

我希望这可以帮助别人。