我有一个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
文件的情况下验证我的服务帐户?
答案 0 :(得分:20)
我在google-auth-library-ruby
宝石的source code找到答案。
事实证明还有另一种选择:从client_secrets
文件中获取值并将它们放在名为GOOGLE_ACCOUNT_TYPE
,GOOGLE_CLIENT_ID
,GOOGLE_CLIENT_EMAIL
和{{的环境变量中1}}分别。
如果填充了这些密钥,则将从那里加载凭据。不过,在文档中并没有这样的耳语。
答案 1 :(得分:1)
由于这是搜索谷歌搜索“谷歌服务凭证红宝石”时返回的主要结果之一,我想我会将我最近的经验添加到可能的答案列表中。
虽然您可以使用第一个答案中提到的方法,但我找到了一个适用于Heroku的替代解决方案。我知道它在另一篇文章中有所提及,但遗漏的关键是如何正确存储完整的GOOGLE_APPLICATION_CREDENTIALS .json文件,以便它可以全部保存在Heroku的一个环境中而不会让特殊字符炸毁你的应用时尝试
我详细介绍了以下步骤:
一旦你有一行删除了空格和换行符的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这样的宝石,您可以将格式化的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