37

Ho sviluppato un prototipo di app a singola pagina che utilizza Backbone sul front-end e che consuma da una sottile API RESTful sul server per i suoi dati.Autenticazione per utenti su un'app per singola pagina?

Provenendo da uno sviluppo di applicazioni lato server (php e python), ho apprezzato molto il nuovo approccio di progettazione con un MVC lato client spesso ma sono confuso sul modo migliore per limitare l'app agli utenti autenticati che accedono.

Preferisco avere l'app stessa dietro un login e vorrei anche implementare altri tipi di login (openid, fb connect, ecc.) Oltre al login nativo del sito. Non sono chiaro in che modo sia stato fatto e ho cercato, per quanto non sia riuscito a trovare le informazioni che mi hanno reso chiaro.

Nell'immagine grande, qual è la migliore prassi corrente per registrare gli utenti e richiedere loro di accedere per utilizzare l'app per la singola pagina?

Una volta effettuato l'accesso, come vengono autenticate le richieste API? Posso memorizzare una sessione, ma come faccio a rilevare questa sessione nelle chiamate API o c'è un token che devo passare in ogni singola chiamata API? Qualsiasi risposta a questo sarebbe molto apprezzata!

+2

Cosa hai fatto infine? Scegli una risposta se una delle risposte esistenti è stata risolta o aggiungi la tua soluzione? – tgkprog

risposta

7

Utilizziamo l'autenticazione basata su cookie Django e disponiamo di una pagina separata per il login e l'app a pagina singola. Funziona piuttosto bene per il nostro caso d'uso. Abbiamo utilizzato un sistema di gestione delle sessioni basato su Backbone che ho descritto qui: backbone.js - handling if a user is logged in or not

+1

Faccio qualcosa di simile a ciò che è collegato. Ho un modello che si occupa esclusivamente di autenticazione (login/logout), verifica che sul lato server rispedisca una risposta.La richiamata di errore o di successo invia quindi un evento che la mia app e le sue viste stanno ascoltando. Al ritorno dal server, invio una sessione di cookie crittografata che uso poi con ogni chiamata per verificare che siano autenticati. – jmk2142

+1

@orangewarp: Ciò che hai descritto suona molto (se non esattamente) come quello di cui abbiamo bisogno. Stiamo usando knockout.js, non backbone.js. C'è un modo per fornire maggiori dettagli su come hai implementato la tua soluzione? Forse qualche codice di esempio? Grazie! – lmttag

4

Stiamo usando Angular.js e inoltre, abbiamo una pagina separata per il login. La pagina separata carica un'applicazione separata a pagina singola (e sicura), che chiama il server utilizzando la richiesta http XHR, inviando nome utente e password. Se il server ha autenticato le credenziali, il codice javascript imposta un cookie. questo cookie potrebbe essere letto dall '"altra parte", cioè l'applicazione non sicura. Nel cookie inseriamo solo il nome utente e, naturalmente, nessuna password o altre informazioni protette. quindi possiamo mostrare qualcosa come 'Non Lior? Disconnetti "sull'app non protetta.

unica cosa da notare è quello di sostituire il meccanismo dei cookie di angolare per impostare una scadenza indefinita e, cosa più importante, percorso principale:

$document[0].cookie = 'username=' + escape($scope.userName) + ";expires=Thu, 01 Jan 2970 00:00:00 GMT; Path=/"; 
7

Il modo più riposante che ho visto è basata sul client OAuth scorrono le credenziali, fondamentalmente un endpoint/token che inserisci username/password a cui restituisce un token di accesso per questa sessione. Ogni richiesta Ajax successiva aggiunge un'intestazione del portatore Authorization con il token. È possibile memorizzare il token in una variabile globale per mantenerlo finché la pagina non viene aggiornata/chiusa, utilizzare la memoria locale per mantenere gli utenti connessi tra le sessioni o i cookie javascript. Se non ti piace l'idea dei token, puoi semplicemente utilizzare il vecchio approccio cookie che viene comunque inviato automaticamente con qualsiasi richiesta di ajax.

Come per facebook/google ecc. Di solito seguo l'approccio StackOverflow in cui associo gli account utente esterni a un account. Quindi usa un oauth dance basato su un server abbastanza normale (sebbene tu possa sostituire tutte le richieste al server con richieste Ajax con lievi modifiche, trovo che non fa davvero molta differenza dato che hai bisogno di reindirizzare tra te e il server). Normalmente emetto un cookie crittografato per un login di Facebook, che poi converto in un token usando un metodo simile come sopra (basta inviare il cookie con la richiesta al posto di username/password).

Problemi correlati