Ruby 如果没有默认凭据文件,如何授权Google服务帐户?
我有一个应用程序,我的应用程序使用它从谷歌分析检索数据 当我创建帐户时,我下载了一个Ruby 如果没有默认凭据文件,如何授权Google服务帐户?,ruby,heroku,oauth,google-api-ruby-client,Ruby,Heroku,Oauth,Google Api Ruby Client,我有一个应用程序,我的应用程序使用它从谷歌分析检索数据 当我创建帐户时,我下载了一个client\u secrets文件,其中包含通过OAuth进行授权所需的所有信息,并根据在名为GOOGLE\u APPLICATION\u CREDENTIALS的环境变量中记录了该文件的路径 我现在可以获得一个经过身份验证的客户端,如下所示: authorization = Google::Auth.get_application_default(scopes) 此方法从本地工作的文件中读取凭据,但我的应
client\u secrets
文件,其中包含通过OAuth进行授权所需的所有信息,并根据在名为GOOGLE\u APPLICATION\u CREDENTIALS
的环境变量中记录了该文件的路径
我现在可以获得一个经过身份验证的客户端,如下所示:
authorization = Google::Auth.get_application_default(scopes)
此方法从本地工作的文件中读取凭据,但我的应用程序托管在Heroku上,无法存储文件
我可以提供这个文件(不能),在谷歌官方服务上运行我的应用程序(不会),或者遇到错误
没有客户机密文件
我如何认证我的服务帐户?我在谷歌认证库ruby
gem中找到了答案
事实证明,还有另一种选择:从客户机机密文件中获取值,并将它们分别放入名为谷歌账户类型,谷歌客户机ID
,谷歌客户机电子邮件
和谷歌私钥
的环境变量中
如果填充了这些密钥,则将从那里加载凭据。不过,在文档中没有提及这一点。因为这是在谷歌搜索“谷歌服务凭证ruby”时返回的主要结果之一,所以我想我会将最近的经验添加到可能的答案列表中
虽然您可以使用第一个答案中提到的方法,但我找到了另一种与Heroku配合良好的解决方案。我知道在另一篇文章中有人提到过它,但被忽略的关键是如何正确地存储完整的GOOGLE_应用程序_CREDENTIALS.json文件,这样它就可以保存在Heroku上的一个env中,而不必在尝试打开应用程序时使用特殊字符
我将在下面详细介绍我的步骤:
按照以下谷歌说明获取您的谷歌应用程序证书json文件:
当然,这将包含一个json对象,其中包含heroku根本不需要的所有空格、换行符和引号。因此,去掉所有空格和换行符…注意这里->除了“开始私钥”段中的换行符。基本上将json转换为一个长字符串。使用任何你觉得合适的方法李>
删除了空格和换行符的单行json文件后,需要通过运行以下命令将其添加到Heroku:
heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< /Users/whoever/Downloads/[CREDENTIAL_JSON_FILENAME].json)" --app your-app
请注意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
如果您使用的是类似gem的dotenv,那么可以将格式化的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
更多详情:
如果您使用此方法获取服务帐户令牌,请执行以下操作:authorizer=Google::Auth::ServiceAccountCredentials.make_creds(json_key_io:StringIO.new(ENV['Google_APPLICATION_CREDENTIALS')),作用域:https://www.googleapis.com/auth/firebase.messaging“”
授权人。获取\u访问\u令牌代码>来自@JeppeLiisberg-很好的观点。我没有真正提到OP的授权部分。谢谢你的澄清。
require "google/cloud/bigquery"
ENV["BIGQUERY_PROJECT"] = "my-project-id"
ENV["BIGQUERY_CREDENTIALS"] = "path/to/keyfile.json"
bigquery = Google::Cloud::Bigquery.new