2015-12-11 12 views
8

Ho eseguito abbastanza bene l'implementazione di Angular SPA e JWT, ma ho sempre difficoltà a delegare un nuovo token.Strategia di base per il token di aggiornamento delegato per ottenere il nuovo JWT

La mia strategia di base è stata:

  1. In autenticazione intercettore ottenere Auth errore => delegato con token di aggiornamento, sostituire JWT, altrimenti il ​​logout

che non ha funzionato, perché più chiamate asincrone avrebbero sparato e si otterrebbe la funzione delegate, ma il token di aggiornamento sarebbe stato utilizzato per il secondo e quello non funzionerà, quindi l'utente verrebbe disconnesso.

  1. Prima di ogni altra cosa: Controllare scadenza del token, se scaduto => delegato con token di aggiornamento, sostituire JWT, altrimenti il ​​logout

che aveva un problema simile in cui la prima chiamata noterebbe che era scaduto, e andare a prendere il nuovo token, ma dal momento che è Async, il resto delle chiamate potrebbe sparare e fallire ecc.

Qual è la strategia di base qui. Sento che la prima cosa che l'app dovrebbe fare è controllare il JWT e delegarne uno nuovo se è un token non valido, ma in quel caso non dovrebbe essere asincrono. Non riesco a eliminare il token di aggiornamento in uso?

Qualsiasi aiuto sarebbe grande, sento che questo è l'ultimo grande buco nella mia comprensione. Grazie!

+0

controllare questo https://github.com/caolan/async –

risposta

3

Provare a utilizzare Witold Szczerba's "http interceptor".

In breve i primi trigger di chiamate http non riusciti e gli eventi e le chiamate successive vengono inseriti in una matrice. Al momento dell'attivazione dell'evento si ha la possibilità di fare qualche logica e quindi di ripetere le chiamate fallite.

Detto questo probabilmente si dovrebbe semplicemente eseguire una rotazione di token prima di dover effettivamente utilizzare il token di aggiornamento. Ad esempio, considera questo codice che potrebbe essere aggiunto a this function

.config(function($httpProvider) { 
    $httpProvider.interceptors.push(function(moment, $rootScope, $q, httpBuffer) { 
     return { 
      request: function (config) { 
       if ($rootScope.authToken) { 
        config.headers["Authentication"] = 'Bearer ' + $rootScope.authToken; 
        var payload = angular.fromJson(atob($rootScope.authToken.split('.')[1])); 
        var utcNow = moment.utc().valueOf(); 
        // 3600000 ms = 1 hr 
        if(utcNow > payload.iat + 3600000){ 
         $rootScope.$broadcast('auth:rotateToken', $rootScope.authToken); 
        } 
       } 

       return config; 
      }, 
      //responseError: ...see Witold's code... 
    }); 
}) 
Problemi correlati