2013-10-04 15 views
14

Sto sviluppando un'applicazione Web sullo stack MEAN (MongoDB, Express, AngularJS e node.js). Sto sviluppando un sistema di login e avrò anche alcune delle rotte Angular protette in modo che solo gli utenti loggati possano accedervi. Sto cercando di pensare al modo migliore per avvicinarmi all'architettura di questo.Architettura per sistema di login su stack MEAN?

Sto pensando al flusso di lavoro corrente:

  • utente accede in via AngularJS forma, che invia un HTTP POST per un endpoint Express. L'endpoint convalida l'utente rispetto al database e risponde con un token OAuth e un cookie. Entrambi sono memorizzati nel database mongo per una successiva convalida.
  • Una volta che AngularJS riceve la risposta di login, memorizza il cookie ricevuto utilizzando ng-cookie e memorizza il token OAuth in un servizio utente.
  • Ogni volta che il percorso cambia in AngularJS ora, il servizio Utente viene utilizzato per assicurarsi che il cookie sia ancora legittimo confrontandolo con i cookie nel database mongo (questa sarebbe una chiamata API usando la risoluzione di Angular ... questo sarebbe creare un ritardo notevole?)
  • Quando un utente fa clic su "Esci" o il cookie scade, il cookie e il token OAuth vengono entrambi eliminati dal database e non saranno più validi.

Questo approccio ha senso? È sicuro e sarà relativamente efficiente/rapido nell'esecuzione?

+1

Ha senso, è anche possibile utilizzare le sessioni, in modo da non controllare il DB ogni volta che si modifica il percorso. – tymeJV

+0

Le sessioni saranno gestite da Express? E poi sulla modifica del percorso avrei comunque effettuato una chiamata API ma non sarebbe stato controllare il DB? – Jakemmarsh

+2

Sì, 'req.session' - Controlla questo post: http: // stackoverflow.it/questions/14218725/working-with-sessions-in-express-js - Oppure puoi eseguire il checkout di HTML5 'sessionStorage' – tymeJV

risposta

8

Ho finito per combinare il mio flusso di lavoro originale con l'esempio di autenticazione di Express, visto here. È il seguente:

  • Quando l'utente inizialmente carica l'app, viene effettuata una chiamata http a un endpoint Express che controlla se esiste già una sessione per l'utente. In tal caso, l'utente viene memorizzato in $rootScope e considerato connesso.
  • Ogni volta che si modifica il percorso di AngularJS, si accede allo stesso endpoint. La protezione del percorso è stata specificata in modo simile a quello descritto in here. Se l'endpoint restituisce mai che non esiste alcuna sessione, $rootScope.user non è impostato (se necessario) e l'utente viene reindirizzato alla pagina di accesso.
  • Quando il modulo di accesso viene elaborato, invia un endpoint Express. L'endpoint recupera l'utente dal mongoDB (se esiste) e tenta di cancellare la password. Se è una corrispondenza, la sessione dell'utente viene impostata, memorizzata nel mongo DB e l'endpoint restituisce l'oggetto user (utilizzato per archiviare in $ rootScope come accennato in precedenza).
  • Ogni volta che si accede a ulteriori endpoint, le funzioni vengono prima passate attraverso la funzione restrict che garantisce l'esistenza di una sessione prima di inviare qualsiasi dato al client. Restituisce un 401 se non esiste alcuna sessione, che viene quindi gestita sul lato Angolare utilizzando this HTTP interceptor per rimuovere $rootScope.user e reindirizzare alla schermata di accesso.
  • Quando l'utente fa clic su "Esci" sul lato Angolare, la sessione viene annullata e cancellata dal DB mongo, $rootScope.user è impostata su null e l'utente viene reindirizzato alla prima pagina.
Problemi correlati