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

我有一个Google服务帐户 ,我的应用可以使用该帐户从Google Analytics中检索数据。

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

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

 authorization = Google::Auth.get_application_default(scopes) 

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

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

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

我在google-auth-library-ruby gem的源代码中找到了答案。

事实certificate还有另一种选择:从client_secrets文件中获取值,并将它们分别放在名为GOOGLE_ACCOUNT_TYPEGOOGLE_CLIENT_IDGOOGLE_CLIENT_EMAILGOOGLE_PRIVATE_KEY环境变量中。

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

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

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

我详细介绍了以下步骤:

  1. 按照Google的说明获取您的GOOGLE_APPLICATION_CREDENTIALS json文件: 身份validation入门
  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']) ) 

注意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中引用文件位置

我希望这可以帮助别人。