2009-12-13 20 views
5

Se ho creato un'applicazione che ha accesso ad alcuni dati da Gmail, Twitter e Facebook, e voglio che l'utente sia in grado di inserire solo le informazioni di autenticazione una volta, ed è resettato dopo alcuni giorni o settimane, qual è il modo migliore per farlo dinamicamente in Ruby?Memorizzazione password per API esterne - Best practice

Vedo un sacco di persone solo con un file di configurazione delle credenziali dei propri clienti/utenti 'in questo modo:


gmail_account: username: myClient password: myClientsPassword 

Questo sembra a) come è molto insicuro, e b) wouldn' lavoro se volevo memorizzare questo tipo di informazioni per migliaia di utenti. Qual è il modo consigliato per farlo?

Mi piacerebbe essere in grado di costruire un'interfaccia in cima a questi servizi, quindi dover inserire le credenziali ogni volta che l'utente ha effettuato una transazione non è fattibile.

risposta

6

Se sei compatibile con la potenziale responsabilità quando un hacker entra nel tuo database/file system, allora vai a prenderlo. E in tutta onestà, dovresti anche comunicare ai tuoi utenti che le loro password saranno memorizzate sul tuo sistema, e lasciare che decidano se vogliono dare al tuo programma quel livello di fiducia.

Ma perché farlo in primo luogo? Facebook Connect e Twitter & Google che utilizza OAuth non ha bisogno di archiviare le password degli utenti. A un certo punto scadranno i cookie dell'utente (o cercheranno di accedere al tuo sito da un altro computer) e dovranno eseguire nuovamente l'autenticazione. Non puoi impedire la ri-autenticazione, ma dovresti renderlo più facile da gestire per l'utente finale.

1

Questo è il modo in cui funziona ad esempio per fetcmailrc che deve essere chmod a 600 (leggibile e scrivibile solo dal suo proprietario). E sì, contiene la semplice password.

6

Tali servizi forniscono l'autorizzazione OpenAuth. Si consiglia vivamente di dargli un'occhiata.

2

Security

Presumo l'applicazione deve conoscere la password in chiaro. Quindi non c'è modo di archiviarlo in una sorta di modo semplice.

  • Memorizzare in una sorta di modo codificato es. Base64, questo ti protegge dalla conoscenza della password quando guardi attraverso il database con gli occhi, ma non ti protegge da nient'altro.
  • Verificare che i file non siano leggibili da altri utenti
  • Criptare il disco rigido, in modo che nessuno possa ottenere le password dal furto del disco rigido. Il tuo computer richiederà di inserire la password durante l'avvio.

Memorizzazione

Non c'è niente di sbagliato con la memorizzazione di molti dati nel vostro file system. Per migliorare le prestazioni è possibile effettuare le seguenti operazioni

  • un file per ogni utente, in modo che il file system e non rubino deve cercare i dati
  • fanno un sacco di subdirectorys. Alcune prestazioni dei file system possono essere compromesse se si inseriscono molti file in una directory. per esempio.mettere il file 'abcd' in 'a/b/c/d'

È possibile utilizzare un database invece del filesystem

0

Vorrei suggerire di utilizzare OAuth, ma se si deve memorizzare le password (si prega di essere assolutamente sicuro che è necessario farlo) è possibile utilizzare la libreria OpenSSL per crittografare le password. La libreria OpenSSL è piuttosto scarsamente documentata in Ruby, ma per quanto ne so sono abbastanza simili alla libreria C OpenSSL. Dato che penso che dovresti usare OAuth e non memorizzare le password ti permetterò di trovare da solo la documentazione.

Tuttavia, per l'approccio OAuth, si vuole dare un'occhiata allo OAuth gem. Google, Twitter (che ti consiglio di utilizzare l'eccellente gemma twitter per) e Facebook (che ha due alternative apparentemente buone: RFacebook e facebooker)