2016-02-02 7 views
8

Sto costruendo un'app per i binari che estrae i dati da Google Analytics utilizzando la libreria client di Google Api per Ruby.Come caricare un file JSON con chiavi segrete per Heroku

Sto utilizzando OAuth2 e posso ottenere tutto ciò che funziona nello sviluppo su una macchina locale. Il mio problema è che la libreria utilizza un file scaricato, client_secrets.json, per memorizzare due chiavi segrete.

Problema: sto utilizzando Heroku e ho bisogno di un modo per ottenere il file nei loro server di produzione.

Non voglio aggiungere questo file al mio repository github poiché il progetto è pubblico.

Se esiste un modo per aggiungere temporaneamente il file a git, premere su Heroku e rimuovere da git che andrebbe bene. La mia sensazione è che le chiavi saranno nei commit e molto difficile da evitare di mostrare su github.

Provato: Finora posso dire che non è possibile SCP un file in Heroku tramite una console Bash. Credo che quando lo fai ottieni un nuovo Dyno e tutto ciò che aggiungi è solo temporaneo. Ho provato questo, ma non ho potuto far funzionare correttamente SCP, quindi non sono sicuro al 100% di questo.

provato: ho guardato memorizzare il file JSON in un ambiente o Config Var, ma non poteva farlo funzionare. Questo sembra il modo migliore per andare se qualcuno ha un pensiero. Spesso corro nei guai quando Ruby converte JSON in una stringa o in un hash, quindi forse ho solo bisogno di una guida qui.

provato: Inoltre ho cercato di trovare un modo per tirare appena fuori le chiavi dal file JSON, metterli in Config Vars, e aggiungere il file JSON a git. Non riesco a trovare un modo per inserire ENV["KEY"] in un file JSON.


Esempio Codice Il Google library has a method che carica il file JSON per creare un client di autorizzazione. Il client preleva un token (o fornisce un URL di autorizzazione).

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

** notare che l'esempio a pagina Google non mostra un nome di file perché usa un default ENV Var thats di stato impostato su un percorso

Immagino che questo sarebbe stato tutto molto più facile se la Il metodo ClientSecrets.load() prenderebbe solo JSON, una stringa o un hash che potrebbe entrare in un Config Var.

Purtroppo sembra sempre voler un percorso di file. Quando lo nutro, JSON, una stringa o un hash, esplode. I've seen someone get around the issue with a p12 key here, ma non sono sicuro di come replicarlo nella mia situazione.

non ho provato: Il mio unico altro se (a parte in movimento a AWS) è quello di mettere il file JSON su AWS e hanno rotaie tirano quando necessario. Non sono sicuro se questo può essere fatto al volo o se il file dovrebbe essere tirato giù quando si avvia il server di rotaie. Sembra troppo lavoro, ma a questo punto ho trascorso alcune ore su di esso così pronto a tentare.

Questo è il controller speciali Io sto lavorando su: https://github.com/dladowitz/slapafy/blob/master/app/controllers/welcome_controller.rb

risposta

7

By ricerca github ho scoperto che qualcuno aveva usato un metodo diverso che utilizza una stringa JSON come un argomento piuttosto che un percorso di file: Google::APIClient::ClientSecrets.new(JSON.parse(ENV['GOOGLE_CLIENT_SECRETS']))

Questo mi permette di concludere la JSON in un VAR ENV. Il mondo ha senso di nuovo.

+0

Come si memorizzano i dati json nell'env var (cioè, newline, virgolette)? Posso importarlo con questa linea nella console, ma ho provato a configurarlo esattamente come lo avete nel controller e sto ricevendo una "non conversione implicita di Symbol in Integer" all'interno della funzione di inizializzazione per ClientSecrets quando si chiama questa linea . Non ho problemi a cercare di accedere all'elemento in cui non funziona, quindi è necessario perdersi da qualche parte nel mezzo. – paullj1

+1

Uso la gemma ** figaro ** e quindi memorizzo le mie variabili ambientali in application.yml. In questo file ho impostato la variabile in questo modo: 'GOOGLE_CLIENT_SECRETS: '{" web ": {" client_id ":" XXXXXX-XXXXXXXXXXXX.apps.googleusercontent.com "," project_id ":" XXXX-XXXX " , "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url":" https://www.googleapis.com/oauth2/v1/certs "," client_secret ":" XXXXXXXXXX "," redirect_uris ": [" http: // localhost: 3000/oauthredirect "]}} '' –

+1

@ paullj1 In Heroku il valore di Config Var è quasi lo stesso, ma ho rimosso le virgolette singole più esterne. Una cosa da notare nella mia soluzione sopra di esso che ho trovato un metodo diverso che non accetta un nome di file. Originariamente stavo usando 'Google :: APIClient :: ClientSecrets.load()' Ora sto usando 'Google :: APIClient :: ClientSecrets.new()' –

1

mi sono imbattuto in questo stesso problema utilizzando Google API. Ho finito per usare openssl per assegnare una nuova passphrase molto segreta al file p12, archiviare quel nuovo file nel repository e quindi inserire la passphrase nei segreti delle app e nelle variabili env di Heroku.

In questo modo, il file si trova nel repository ma non può essere letto/letto senza la passphrase.

This post è stato utile nel cambiare la passphrase di google p12 predefinita da 'notasecret' a qualcosa di sicuro.

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 
1

Come discusso nel this thread, piuttosto che fornire un percorso di un file JSON chiave è possibile impostare tre variabili ENV invece:

GOOGLE_ACCOUNT_TYPE=service_account 
GOOGLE_PRIVATE_KEY=XXX 
GOOGLE_CLIENT_EMAIL=XXX 

Source here.

+0

Questo sembra funzionare utilizzando l'API Cloud Natural Language e mi ha risparmiato un sacco di problemi. – Nick