如何将带有密钥的json文件上传到Heroku

时间:2016-02-02 02:43:50

标签: ruby-on-rails ruby json git heroku

我正在构建一个rails应用程序,使用适用于Ruby的Google Api客户端库从Google Analytics中提取数据。

我正在使用OAuth2,并且可以在本地计算机上开发所有内容。我的问题是该库使用下载的文件client_secrets.json来存储两个密钥。

问题:我正在使用Heroku,需要一种方法将文件发送到他们的生产服务器。

我不想将此文件添加到我的github仓库,因为该项目是公开的。

如果有办法暂时将文件添加到git,请推送到Heroku,然后从git中删除即可。我的感觉是密钥将在提交中,并且很难阻止在github上显示。

尝试: 到目前为止,我可以告诉你不能通过Bash控制台将文件传输到Heroku。我相信当你这样做时你会得到一个新的Dyno,你添加的任何东西都只是暂时的。我试过这个但是无法让SCP正常工作,所以不能100%肯定这一点。

尝试: 我查看了将JSON文件存储在Environment或Config Var中,但无法使其工作。如果有人有想法,这似乎是最好的方式。当ruby将JSON转换为字符串或哈希时,我经常遇到麻烦,所以我可能只需要指导。

尝试: 另外,我试图想出一种方法来从JSON文件中提取密钥,将它们放入Config Vars,并将JSON文件添加到git。我找不到将ENV["KEY"]放在JSON文件中的方法。

示例代码 加载JSON文件以创建授权客户端的Google library has a method。然后客户端获取令牌(或提供授权URL)。

client_secrets = Google::APIClient::ClientSecrets.load('client_secrets.json')
auth_client = client_secrets.to_authorization

**请注意,Google页面上的示例未显示文件名,因为它使用已设置为路径的默认ENV Var

我认为如果ClientSecrets.load()方法只接受JSON,一个字符串或一个可以进入Config Var的哈希,这将会更容易。

不幸的是,似乎总是想要一个文件路径。当我向它提供JSON,字符串或哈希时,它会爆炸。 I've seen someone get around the issue with a p12 key here,但我不确定如何在我的情况下复制它。

没试过: 我唯一的另一个(除了转移到AWS)是将JSON文件放在AWS上并在需要时让它拉出来。我不确定这是否可以动态完成,或者当rails服务器启动时是否需要将文件拉下来。看起来工作太多,但此时我花了几个小时才准备尝试。

这是我正在处理的特定控制器: https://github.com/dladowitz/slapafy/blob/master/app/controllers/welcome_controller.rb

3 个答案:

答案 0 :(得分:10)

通过搜索github我发现有人使用了一种不同的方法,它使用JSON字符串作为参数而不是文件路径:Google::APIClient::ClientSecrets.new(JSON.parse(ENV['GOOGLE_CLIENT_SECRETS']))

这让我将JSON包装成ENV VAR。世界再次有意义。

答案 1 :(得分:3)

this thread中所述,不是提供json密钥文件的路径,而是设置三个ENV变量:

GOOGLE_ACCOUNT_TYPE=service_account
GOOGLE_PRIVATE_KEY=XXX
GOOGLE_CLIENT_EMAIL=XXX

Source here

答案 2 :(得分:1)

我使用Google API遇到了同样的问题。我最终使用openssl为p12文件分配了一个新的非常秘密的密码,将新文件存储在repo中,然后将密码短语放入app secret和Heroku env变量中。

这样,文件就在repo中,但是没有密码就无法访问/读取。

This帖子有助于更改默认的google p12密码短语' notasecret'安全的东西。

def authorize!
  @client.authorization = Signet::OAuth2::Client.new(
    #...
    :signing_key => key
  )
end

def key
  Google::APIClient::KeyUtils.load_from_pkcs12(key_path, ENV.fetch('P12_PASSPHRASE'))
end

def key_path
  "#{Rails.root}/config/google_key.p12"
end