Ruby on rails 如何在RubyonRails中使用ENV变量验证GoogleVision/Cloud

Ruby on rails 如何在RubyonRails中使用ENV变量验证GoogleVision/Cloud,ruby-on-rails,ruby,google-cloud-platform,google-vision,Ruby On Rails,Ruby,Google Cloud Platform,Google Vision,我的应用程序托管在Heroku上,所以我试图找出如何使用Google Cloud提供的JSON(用于身份验证)作为环境变量,但到目前为止,我无法获得身份验证 我搜索了Google和Stack Overflow,找到的最好线索是: 他们都说他们能够让它工作,但他们没有提供我能够工作的代码。有人能帮我吗?我知道这可能是愚蠢的事情 我目前正试图在我的产品模型中利用来自谷歌的示例代码测试该服务。我的看起来像这样: def self.google_vision_labels # Imports t

我的应用程序托管在Heroku上,所以我试图找出如何使用Google Cloud提供的JSON(用于身份验证)作为环境变量,但到目前为止,我无法获得身份验证

我搜索了Google和Stack Overflow,找到的最好线索是:

他们都说他们能够让它工作,但他们没有提供我能够工作的代码。有人能帮我吗?我知道这可能是愚蠢的事情

我目前正试图在我的产品模型中利用来自谷歌的示例代码测试该服务。我的看起来像这样:

def self.google_vision_labels
  # Imports the Google Cloud client library
  require "google/cloud/vision"

  # Your Google Cloud Platform project ID
  project_id = "foo"

  # Instantiates a client
  vision = Google::Cloud::Vision.new project: project_id

  # The name of the image file to annotate
  file_name = "http://images5.fanpop.com/image/photos/27800000/FOOTBALL-god-sport-27863176-2272-1704.jpg"

  # Performs label detection on the image file
  labels = vision.image(file_name).labels

  puts "Labels:"
  labels.each do |label|
    puts label.description
  end
 end
我一直收到这个错误

运行时错误:无法加载默认凭据。浏览到
https://developers.google.com/accounts/docs/application-default-credentials 有关详细信息

根据我所读到的内容,我尝试将JSON内容放在secrets.yml(我正在使用Figaro gem)中,然后根据这个问题的答案在Google.yml文件中引用它

application.yml
中,我把(为了安全起见,我在这篇文章中重写了一些内容):

config/google.yml
中,我将:

GOOGLE_APPLICATION_CREDENTIALS = ENV["GOOGLE_APPLICATION_CREDENTIALS"]
此外,还尝试:

GOOGLE_APPLICATION_CREDENTIALS: ENV["GOOGLE_APPLICATION_CREDENTIALS"]
我还尝试在这两个文件中更改这些变量名,而不是基于此谷歌页面使用
GOOGLE\u CLOUD\u KEYFILE\u JSON
VISION\u KEYFILE\u JSON


有人能帮我理解我在引用/创建带有JSON凭据的环境变量时犯了什么错误吗?谢谢大家!

谷歌决定通过一个文件而不是一系列环境变量来存储机密,从而违背事实上的凭证标准,这真是令人恼火

也就是说,我的解决方案是创建一个.env变量
GOOGLE\u API\u CREDS

我将原始JSON blob粘贴到
.env
中,然后删除所有换行符。然后在应用程序代码中,我使用
JSON.parse(ENV.fetch('GOOGLE\u API\u CREDS')
将JSON blob转换为真正的哈希:

.env
文件:

  GOOGLE_API_CREDS={"type": "service_account","project_id": "your_app_name", ... }
然后在应用程序代码中(以Google OCR客户端为例):


干杯

基于Dylan的回答,我发现我需要使用一个额外的行来配置凭据,如下所示:

Google::Cloud::Language.configure {|gcl| gcl.credentials = JSON.parse(ENV['GOOGLE_APP_CREDS'])}
因为
.new(凭据:…)
方法不适用于Google::Cloud::Language

必须查看谷歌云语言的(稀疏的)ruby参考部分


是的……将秘密存储在文件中确实很烦人。

我在使用谷歌的“入门”文档时遇到了与谷歌云语音相同的问题


上面的答案帮助很大,再加上将我的Google Speech Gem更新为V1()

我只是使用了一个
StringIO
对象,让Psych认为我读的是一个实际的文件:

google:
  service: GCS
  project: ''
  bucket: ''
  credentials: <%= StringIO.new(ENV['GOOGLE_CREDENTIALS']) %>
google:
服务:地面军事系统
项目:“”
存储桶:“”
资格证书:

Im对此不是100%,我对figaro gem不太熟悉。不过我认为它与
dotenv
gem类似。我知道它们可以在生产环境中使用(尽管我建议仅在开发/测试环境中使用)但是如果你是,可能值得检查figaro gem添加到的Gemfile组与你在Heroku上运行应用程序的
RAILS_ENV
相匹配。此外,我从figaro文档中看到,Heroku的部署过程应该是运行类似
figaro Heroku:set-e production
的命令。我希望这能有所帮助。Doe如果您在本地启动应用程序,它是否正常工作?或者您是否存在与身份验证相关的相同凭据错误?请在此处添加答案的相关部分,因为链接可能会随着时间的推移而更改。
Google::Cloud::Language.configure {|gcl| gcl.credentials = JSON.parse(ENV['GOOGLE_APP_CREDS'])}
google:
  service: GCS
  project: ''
  bucket: ''
  credentials: <%= StringIO.new(ENV['GOOGLE_CREDENTIALS']) %>