如何在没有默认凭据文件的情况下授权 Google 服务帐户?
How can I authorize a Google Service Account without the default credentials file?
我的应用程序使用 Google Service Account 从 Google Analytics 检索数据。
创建帐户时,我下载了一个 client_secrets
文件,其中包含通过 OAuth 授权所需的所有必要信息,并且我根据 Google's documentation.
我现在可以像这样获得经过身份验证的客户端:
authorization = Google::Auth.get_application_default(scopes)
此方法从文件中读取凭据,在本地工作,但我的应用程序托管在无法存储文件的 Heroku 上。
The documentation states 我可以提供此文件(不能),运行 我的应用程序在官方 Google 服务上(不会),或者遇到错误。
如何在没有 client_secrets
文件的情况下验证我的服务帐户?
我在 google-auth-library-ruby
gem 的 source code 中找到了答案。
事实证明还有另一种选择:从 client_secrets
文件中获取值并将它们放入名为 GOOGLE_ACCOUNT_TYPE
、GOOGLE_CLIENT_ID
、GOOGLE_CLIENT_EMAIL
和GOOGLE_PRIVATE_KEY
分别
如果填充了这些密钥,将从那里加载凭据。不过,在文档中并没有提及这一点。
由于这是 returns 在 google 中搜索 "google service credentials ruby," 时的主要结果之一,我想我会将我最近的经验添加到可能的答案列表中。
虽然您可以执行第一个答案中提到的方法,但我找到了一个适用于 Heroku 的替代解决方案。我知道它在另一个 post 中有所提及,但遗漏的关键是如何正确存储完整的 GOOGLE_APPLICATION_CREDENTIALS .json 文件,以便它可以全部保存在Heroku 上的一个环境并且没有特殊字符在尝试
时会炸毁你的应用程序
我在下面详细说明了我的步骤:
- 按照此处 Google 的说明获取您的 GOOGLE_APPLICATION_CREDENTIALS json 文件:Getting Started with Authentication
- 当然,这将包含一个 json 对象,其中包含 heroku 根本不需要的所有空格、行 returns 和引号。因此,删除所有空格和换行符...并注意此处 -> EXCEPT 'BEGIN PRIVATE KEY' 段内的换行符。基本上将 json 变成一个长字符串。使用您觉得舒服的任何方法。
一旦你有一个删除了空格和换行符的单行 json 文件,你将需要通过 运行 以下命令将它添加到 Heroku:
heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< /Users/whoever/Downloads/[CREDENTIAL_JSON_FILENAME].json)" --app your-app
对于我的情况,我需要在初始化时提供可用的服务帐户,所以我将它放在 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
中的文件位置
我希望这对某人有所帮助。
我找到了这个
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
我的应用程序使用 Google Service Account 从 Google Analytics 检索数据。
创建帐户时,我下载了一个 client_secrets
文件,其中包含通过 OAuth 授权所需的所有必要信息,并且我根据 Google's documentation.
我现在可以像这样获得经过身份验证的客户端:
authorization = Google::Auth.get_application_default(scopes)
此方法从文件中读取凭据,在本地工作,但我的应用程序托管在无法存储文件的 Heroku 上。
The documentation states 我可以提供此文件(不能),运行 我的应用程序在官方 Google 服务上(不会),或者遇到错误。
如何在没有 client_secrets
文件的情况下验证我的服务帐户?
我在 google-auth-library-ruby
gem 的 source code 中找到了答案。
事实证明还有另一种选择:从 client_secrets
文件中获取值并将它们放入名为 GOOGLE_ACCOUNT_TYPE
、GOOGLE_CLIENT_ID
、GOOGLE_CLIENT_EMAIL
和GOOGLE_PRIVATE_KEY
分别
如果填充了这些密钥,将从那里加载凭据。不过,在文档中并没有提及这一点。
由于这是 returns 在 google 中搜索 "google service credentials ruby," 时的主要结果之一,我想我会将我最近的经验添加到可能的答案列表中。
虽然您可以执行第一个答案中提到的方法,但我找到了一个适用于 Heroku 的替代解决方案。我知道它在另一个 post 中有所提及,但遗漏的关键是如何正确存储完整的 GOOGLE_APPLICATION_CREDENTIALS .json 文件,以便它可以全部保存在Heroku 上的一个环境并且没有特殊字符在尝试
时会炸毁你的应用程序我在下面详细说明了我的步骤:
- 按照此处 Google 的说明获取您的 GOOGLE_APPLICATION_CREDENTIALS json 文件:Getting Started with Authentication
- 当然,这将包含一个 json 对象,其中包含 heroku 根本不需要的所有空格、行 returns 和引号。因此,删除所有空格和换行符...并注意此处 -> EXCEPT 'BEGIN PRIVATE KEY' 段内的换行符。基本上将 json 变成一个长字符串。使用您觉得舒服的任何方法。
一旦你有一个删除了空格和换行符的单行 json 文件,你将需要通过 运行 以下命令将它添加到 Heroku:
heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< /Users/whoever/Downloads/[CREDENTIAL_JSON_FILENAME].json)" --app your-app
对于我的情况,我需要在初始化时提供可用的服务帐户,所以我将它放在 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
中的文件位置我希望这对某人有所帮助。
我找到了这个
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