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

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

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

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

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

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

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

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

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


示例代码 Google库有一个加载JSON文件以创建授权客户端的方法。 然后客户端获取令牌(或提供授权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,字符串或哈希时,它会爆炸。 我看到有人在这里用p12键来解决这个问题 ,但我不确定如何在我的情况下复制它。

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

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

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

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

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

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

这篇文章有助于将默认的谷歌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 

正如在这个线程中讨论的那样,您可以设置三个ENV变量,而不是提供json密钥文件的路径:

 GOOGLE_ACCOUNT_TYPE=service_account GOOGLE_PRIVATE_KEY=XXX GOOGLE_CLIENT_EMAIL=XXX 

来源于此 。