2012-08-29 13 views
11

Ok. Ho iniziato a sviluppare un'applicazione per Android per la nostra app Web aziendale. Ha appena iniziato la progettazione delle attività della schermata di login.Progettazione e sviluppo di login Android - Approcci e buone pratiche

Questa app è completamente gestita dall'API RESTFul.

Mi piacerebbe capire come sviluppare la funzione di accesso/uscita nell'applicazione. Per quanto ne so, non esiste un concetto di sessione nel mondo delle app. Inoltre, per l'API, abbiamo bisogno di inviare Username e Password ad ogni richiesta (Basic Auth). Quindi apparentemente, abbiamo bisogno di mantenere le credenziali di accesso da qualche parte nella memoria locale da inviare insieme ad ogni richiesta.

Ecco cosa ho capito dalla mia conoscenza base di Android.

Quando l'utente immette le informazioni di accesso e preme il pulsante, verrà avviata una chiamata HTTP all'API. Se le credenziali di accesso sono valide, allora dovremo memorizzare le credenziali localmente. Le opzioni sono

  1. SQLite
  2. Preferenze condivise. (Non ho mai usato. Ma io parto dal presupposto, possiamo usare questo)
  3. Bundle (non so se questa è un'opzione)

altre alternative?

Voglio assicurarmi di seguire le migliori pratiche, pur non sacrificando dal punto di vista delle prestazioni e dell'architettura.

E per il logout, penso che ho solo bisogno di cancellare le credenziali memorizzate localmente e mostrare attività di accesso.

Esistono approcci diversi e migliori?

risposta

13

Suggerirei di utilizzare la funzione Android Accounts.

This blog ha una buona guida passo passo su tutti i bit che è necessario mettere insieme.

L'idea generale è di fornire AccountManager con nome utente/password degli utenti e lasciarlo al gestore account per memorizzarli in modo sicuro.

Quando è necessario un token di autenticazione, è necessario chiedere ad AccountManager di restituire un token memorizzato nella cache o richiamare il codice (passando il nome utente/password) e si effettua la chiamata al servizio di autenticazione per prendi un token fresco.

+0

Sono confuso riguardo al 3 ° par. Quando archivi i dati in Account, scade in un momento? Ciò significa che, se l'utente si trova nel mezzo dell'app, in alcune attività, se gli account non mi danno U/P, devo mostrare la schermata di accesso per afferrare di nuovo l'U/P? –

+0

@KevinRave Sta prendendo in considerazione il riutilizzo del token di accesso dalle preferenze –

+0

Il nome utente/password non scadrà. Il token di autenticazione restituito dal tuo webservice può scadere (sul lato server), se ciò accade devi informare l'AccountManager che il token è scaduto e che attiverà il callback che ti chiede di ottenere un nuovo token – Rob

2

Generalmente, esistono tre modi per mantenere i dati in Android: SQLite, SharedPreferences e la lettura/scrittura su un file a Java I/O. SQLite è ottimale per i dati relazionali, ma poiché è sufficiente memorizzare le credenziali dell'utente, ti consiglio di utilizzare SharedPreferences. Mi sembra un semplice modello di dati valore-chiave.

SharedPreferences sono fondamentalmente solo un incapsulamento di I/O di file diretti, ovvero l'implementazione sottostante è ancora la lettura e la scrittura di file, ma semplificata per coppie chiave-valore. Non so molto sulla crittografia, ma potrebbe essere necessario gestirla personalmente prima di memorizzare la password in un oggetto SharedPreferences (prendere in considerazione anche il suggerimento di JaiSoni: utilizzare invece un token di accesso). Tuttavia, assicurati che se crei il SharedPreferences e lo imposti su MODE_PRIVATE, le altre app non avranno accesso al file di prefs condiviso.

Credo che sia praticamente un'implementazione standard. Se guardi questa pagina, c'è davvero solo così tanto che puoi fare: http://developer.android.com/guide/topics/data/data-storage.html

Posso anche sottolineare che una delle complessità con I/O di file diretto è che dovrai decidere dove vuoi archiviare il file - memoria interna o esterna (ad esempio, scheda SD) - e quindi verificare la sua disponibilità (non tutti i dispositivi hanno slot per schede SD, e talvolta la memoria interna è registrata come memoria esterna al dispositivo). Quindi vai con prefs condivisi.

Per disconnettersi, questo potrebbe essere utile: Deleting shared preferences

+0

Grazie. Voglio sapere, se questo è un modo standard per farlo. O ci sono modi migliori per farlo. A proposito di logout? –

+0

@KevinRave Vedi modifica. –

2

Penso che la memorizzazione di password nel app è cattiva idea, approccio migliore è solo fare richiesta con credenziali utente a prima volta quando l'utente ottiene il login al server restituisce un token di accesso salva questo token di accesso in SharedPreferences per il resto dello scopo, come ottenere i dettagli dell'utente, utilizzare il token in richiesta.
Sessione: crea la tua classe per la sessione di mantenimento. Hackbook ne è un buon esempio.

+0

Ottimo suggerimento. Ciò richiederà loro di modificare il back-end, però, ho ragione? Se il meccanismo del token di accesso non è ancora stato implementato, lo è. –

+0

@mattquiros Sì, è necessario un servizio Web che supporti il ​​token di accesso –

+0

@mattquiros Hai ragione. Questo è un cambio di logica di business nel back-end. Questo non può essere fatto in questo momento. –

0

Perché è necessario mantenere le credenziali di accesso in un file o database? vuoi essere registrato automaticamente dopo il riavvio della tua app? se la persistenza non è necessaria, è possibile inserire le credenziali in un membro java statico.

+0

È accessibile attraverso l'applicazione, durante la sessione utente? –

+0

E Non sei sicuro di come assegni nome utente e password ai membri statici durante il runtime? –

+0

È accessibile se lo rendi pubblico. Per maggiori dettagli consulta [tutorial Understanding Instance and Class Members] (http://docs.oracle.com/javase/tutorial /java/javaOO/classvars.html) – k3b

Problemi correlati