【问题标题】:How can I authorize a Google Service Account without the default credentials file?如何在没有默认凭据文件的情况下授权 Google 服务帐户?
【发布时间】:2016-03-10 23:51:48
【问题描述】:

我有一个Google Service Account,我的应用程序使用它来从 Google Analytics(分析)中检索数据。

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

我现在可以像这样获得经过身份验证的客户端:

authorization = Google::Auth.get_application_default(scopes) 

此方法从文件中读取凭据,在本地工作,但我的应用托管在 Heroku 上,无法存储文件。

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

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

【问题讨论】:

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


    【解决方案1】:

    我在google-auth-library-ruby gem 的source code 中找到了答案。

    原来还有另外一种选择:从client_secrets文件中取出值,分别放在名为GOOGLE_ACCOUNT_TYPEGOOGLE_CLIENT_IDGOOGLE_CLIENT_EMAILGOOGLE_PRIVATE_KEY的环境变量中。

    如果填充了这些密钥,凭据将从那里加载。不过,文档中并没有提到这一点。

    【讨论】:

      【解决方案2】:

      由于这是在 google 搜索“google service credentials ruby​​”时返回的主要结果之一,我想我会将我最近的经验添加到可能的答案列表中。

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

      我在下面详细说明我的步骤:

      1. 按照此处的 Google 说明获取您的 GOOGLE_APPLICATION_CREDENTIALS json 文件:Getting Started with Authentication
      2. 当然,这将包含一个 json 对象,其中包含 heroku 根本不需要的所有空格、换行符和引号。因此,去掉所有空格和换行符...并在此处注意 -> 除了 'BEGIN PRIVATE KEY' 段内的换行符。基本上将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'])
        )
        

      注意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 这样的 gem,您可以将格式化的 json 字符串存储为 ENV,或者您可以仅引用 ENV 中的文件位置

      我希望这对某人有所帮助。

      【讨论】:

      • 如果您使用此方法获取服务帐户令牌,请这样做:authorizer = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: StringIO.new(ENV['GOOGLE_APPLICATION_CREDENTIALS']), scope: "https://www.googleapis.com/auth/firebase.messaging") authorizer.fetch_access_token! from the googleauth docs
      • @JeppeLiisberg - 好点。我并没有真正解决 OP 的授权部分。感谢您的澄清。
      【解决方案3】:

      我找到了这个

      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

      【讨论】:

        猜你喜欢
        • 2021-02-15
        • 2017-09-10
        • 2021-06-24
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 2013-08-21
        相关资源
        最近更新 更多