2014-04-25 6 views
5

So che questo è stato chiesto infinite volte, ma nessuna delle risposte che ho trovato descritto la connessione effettiva al back-end.Come scoprire se l'utente è ancora loggato usando l'autenticazione basata su sessione?

Ho un'app JS di una pagina che comunica con l'API di backend (Django) di piccole dimensioni. Io uso l'autenticazione basata sulla sessione. Le informazioni utente sono memorizzate nella cache al primo caricamento. Se la sessione scade, ho bisogno di cambiare l'intestazione della pagina e svuotare le informazioni utente dalla cache. Tuttavia, la maggior parte delle mie risorse API sono pubbliche e restituiscono sempre 200. Diverse altre risorse sono private e restituiscono 403 se l'utente non ha effettuato l'accesso, il che è ottimo in quanto mi dà le informazioni di cui ho bisogno. Il problema è che alcune pagine accedono solo alle risorse pubbliche. Nel caso in cui la sessione venga cancellata improvvisamente sul backend e l'utente passi all'URL che accede solo alle risorse pubbliche, le informazioni dell'utente non vengono scaricate e ho un problema di UX.

La mia idea iniziale era di richiedere risorse di utenti privati ​​(chiamiamolo /users/self/) a ogni modifica di URL che restituisce 200 nel caso l'utente sia autenticato e 403 nel caso in cui non lo siano. Ciò richiede tuttavia 1 richiesta extra prima di ogni altra richiesta per ogni modifica dell'URL, che non è proprio l'ideale.

Esistono tecniche più semplici che potrei utilizzare in questo caso? Non mi dispiace nemmeno passare ad altro tipo di autenticazione se questo risolvesse il problema.

risposta

2

Quello che ho fatto e visto per tali scenari è utilizzare un tipo di intercettore http che intercetta tutte le richieste http eseguite da Angular e se trova uno stato di risposta di 401, tali intercettori generano un evento usando $rootScope.

Vedi una libreria qui https://github.com/witoldsz/angular-http-auth

Per usarlo, si ha la necessità di sottoscrivere gli eventi sollevare utilizzando qualche tipo di controller di radice, che può reindirizzare l'utente alla pagina di login.

vedere un esempio qui https://medium.com/opinionated-angularjs/7bbf0346acec

+0

Il problema è che la maggior parte delle risposte sono pubbliche e restituiscono sempre 200. Non avrebbe senso restituire 403/401 se la sessione è scaduta. –

+0

@ OndrejSlinták non mescolare percorsi sul server che richiedono una sessione con percorsi pubblici aperti. Questo creerà più lavoro per te più tardi. – cgTag

+0

Quello che stai dicendo è che le risposte pubbliche dipendono da alcune risorse limitate, il che significa che devono essere limitate o in qualche modo accedere alla risorsa riservata che causa un reindirizzamento dell'autenticazione all'accesso. – Chandermani

1

Invece di inviare una richiesta di autenticazione aggiuntivo, basta controllare nel vostro backend in ogni richiesta, se la sessione non ha ancora scadere. Se l'utente non è autent, restituire un codice di stato.

In angularjs abbiamo utilizzato un intercettore httpResponse, che intercetta ogni risposta e controlla questo codice di stato.

+0

Non posso farlo perché alcuni URL richiedono solo risorse pubbliche che restituiscono sempre 200. Non avrebbe senso che restituiscano qualcos'altro. –

+0

ma se non si è effettuato il login e si richiede una risorsa, deve esserci una reazione diversa. –

1

Noi al lavoro facciamo ciò che altri hanno già detto: utilizzare un HttpInterceptor.

abbiamo ogni risposta inviata dal nostro backend strutturati nello stesso modo: un oggetto con due campi: un responseCode e l'attuale risposta. Variando il codice di risposta in base a quanto accaduto nel back-end, il successo, l'avviso di sicurezza o l'autenticazione richiesta per quella determinata azione sono i casi più comuni.

Quindi l'interceptor reagisce nel modo appropriato in base a ciascun ResponseCode che abbiamo definito. Nel caso di un'autenticazione richiesta, effettuiamo il reindirizzamento alla pagina di accesso, potremmo fare tutto il necessario. Funziona alla grande per noi.

1

Il tuo back-end potrebbe aggiungere un'intestazione alla risposta se l'utente è ancora connesso, indipendentemente dal fatto che la risorsa richiesta sia pubblica o meno. Il cliente può quindi verificare la presenza di quell'intestazione e agire di conseguenza.

Su entrambi i lati questo è fatto con un qualche tipo di filtro o intercettore. In angolare questo sarebbe un $http interceptor.

+0

Stavo pensando a questo, ma ciò renderebbe il caching delle risposte un po 'più difficile. Ma questo è solo il mio caso particolare. –

+0

@ OndrejSlinták Potresti per favore approfondire le tue preoccupazioni? Non vedo come questo possa influenzare il caching. – zeroflagL

+0

Nel mio caso, sto memorizzando nella cache le risposte complete, comprese le intestazioni. In questo modo dovrei modificarli prima di inviare la risposta. Ma è ancora qualcosa che sto considerando. –

Problemi correlati