Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如果没有默认凭据文件,如何授权Google服务帐户?_Ruby_Heroku_Oauth_Google Api Ruby Client - Fatal编程技术网

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