Cómo upload un file json con keys secretas a Heroku

Estoy construyendo una aplicación de Rails que extrae datos de Google Analytics utilizando Google Api Client Library para Ruby.

Estoy usando OAuth2 y puedo hacer que todo funcione en desarrollo en una máquina local. Mi problema es que la biblioteca utiliza un file descargado, client_secrets.json , para almacenar dos keys secretas.

Problema: estoy usando Heroku y necesito una forma de llevar el file a sus serveres de producción.

No quiero agregar este file a mi repository github ya que el proyecto es público.

Si hay una forma de agregar temporalmente el file a git, presiona a Heroku y quita del git que estaría bien. Mi sensación es que las keys estarán en los commits y será muy difícil evitar que se muestren en github.

Intenté: hasta donde puedo decir que no puedes SCP un file a Heroku a través de una console Bash. Creo que al hacer esto obtienes un nuevo Dyno y todo lo que añadas será solo temporal. Intenté esto pero no pude hacer que SCP funcione correctamente, así que no estoy 100% seguro de esto.

Intenté: busqué almacenar el file JSON en un entorno o configuration Var, pero no pude hacerlo funcionar. Esta parece ser la mejor manera de ir si alguien tiene un pensamiento. A menudo me encuentro en problemas cuando Ruby convierte JSON en una cadena o hash, así que posiblemente solo necesite orientación aquí.

Intenté: Además, traté de encontrar la forma de extraer las keys del file JSON, ponerlas en Config Vars y agregar el file JSON a git. Sin embargo, no puedo encontrar una manera de poner ENV["KEY"] en un file JSON.


Código de ejemplo La biblioteca de Google tiene un método que carga el file JSON para crear un cliente de autorización. El cliente luego obtiene un token (o le da una url de autorización).

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

** tenga en count que el ejemplo en la página de google no muestra un nombre de file porque utiliza un ENV Var pnetworkingeterminado que se ha establecido en una ruta

Me imagino que todo esto sería mucho más fácil si el método ClientSecrets.load() simplemente tomara JSON, una cadena o un hash que podría entrar en un Var de configuration.

Desafortunadamente, siempre parece querer una ruta de file. Cuando lo alimento JSON, una cadena o hash, explota. He visto a alguien solucionar el problema con una key p12 aquí , pero no estoy seguro de cómo replicar eso en mi situación.

No lo he intentado: mi único otro (además de mudarme a AWS) es poner el file JSON en AWS y hacer que los Rails lo extraigan cuando sea necesario. No estoy seguro de si esto se puede hacer sobre la marcha o si el file debería ser derribado cuando se inicie el server de Rails. Parece demasiado trabajo, pero en este punto he pasado unas horas listo para intentarlo.

Este es el controller específico en el que estoy trabajando: https://github.com/dladowitz/slapafy/blob/master/app/controllers/welcome_controller.rb

Al search en github encontré que alguien había usado un método diferente que usaba una cadena JSON como argumento en lugar de una ruta de file: Google::APIClient::ClientSecrets.new(JSON.parse(ENV['GOOGLE_CLIENT_SECRETS']))

Esto me permite resumir el JSON en un ENV VAR. El mundo tiene sentido otra vez.

Me encontré con este mismo problema usando Google API. Terminé usando openssl para asignar una nueva frase de contraseña muy secreta al file p12, almacenando ese nuevo file en el repository y luego colocando la contraseña en los secretos de la aplicación y en las variables env de Heroku.

De esta manera, el file está en el repository pero no se puede acceder / leer sin la frase de contraseña.

Esta publicación fue útil para cambiar la frase de contraseña pnetworkingeterminada de google p12 de 'notasecret' a algo seguro.

 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 

Como se discutió en este hilo , en lugar de proporcionar una ruta a un file de key json, puede establecer tres variables ENV en su lugar:

 GOOGLE_ACCOUNT_TYPE=service_account GOOGLE_PRIVATE_KEY=XXX GOOGLE_CLIENT_EMAIL=XXX 

Fuente aquí .