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

时间:2016-03-10 23:51:48

标签: ruby heroku oauth google-api-ruby-client

我有一个Google Service Account我的应用用于从Google Analytics检索数据。

当我创建帐户时,我下载了client_secrets文件,其中包含通过OAuth授权的所有必要信息,我按照{{3}在名为GOOGLE_APPLICATION_CREDENTIALS的环境变量中记录了此文件的路径}}

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

authorization = Google::Auth.get_application_default(scopes) 

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

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

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

3 个答案:

答案 0 :(得分:20)

我在google-auth-library-ruby宝石的source code找到答案。

事实证明还有另一种选择:从client_secrets文件中获取值并将它们放在名为GOOGLE_ACCOUNT_TYPEGOOGLE_CLIENT_IDGOOGLE_CLIENT_EMAIL和{{的环境变量中1}}分别。

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

答案 1 :(得分:1)

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

虽然您可以使用第一个答案中提到的方法,但我找到了一个适用于Heroku的替代解决方案。我知道它在另一篇文章中有所提及,但遗漏的关键是如何正确存储完整的GOOGLE_APPLICATION_CREDENTIALS .json文件,以便它可以全部保存在Heroku的一个环境中而不会让特殊字符炸毁你的应用时尝试

我详细介绍了以下步骤:

  1. 按照Google的说明获取您的GOOGLE_APPLICATION_CREDENTIALS json文件:Getting Started with Authentication
  2. 当然,这将包含一个json对象,其中包含heroku根本不需要的所有空格,换行符和引号。因此,去除所有空格和换行符......并注意这里 - > 除了以便在“开始私钥”段内进行线路突破。基本上把json变成一个长串。使用您认为合适的任何方法。
  3. 一旦你有一行删除了空格和换行符的json文件,你需要运行以下命令将它添加到Heroku:

    heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< /Users/whoever/Downloads/[CREDENTIAL_JSON_FILENAME].json)" --app your-app
    
  4. 对于我的情况,我需要在初始化时提供服务帐户,所以我将它放在我的rails应用程序的初始化程序中:

    GOOGLE_SERVICE_ACCOUNT_CREDENTIALS=Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: StringIO.new(ENV['GOOGLE_APPLICATION_CREDENTIALS'])
    )
    
  5. 注意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
    

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

    我希望这有助于某人。

答案 2 :(得分:0)

我发现了

require "google/cloud/bigquery"

ENV["BIGQUERY_PROJECT"]     = "my-project-id"
ENV["BIGQUERY_CREDENTIALS"] = "path/to/keyfile.json"

bigquery = Google::Cloud::Bigquery.new

更多细节:

https://github.com/googleapis/google-cloud-ruby/blob/master/google-cloud-bigquery/AUTHENTICATION.md