我正在构建一个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
答案 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
答案 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