2016-05-23 6 views
2

Ich habe eine einfache (halb fertig) http Abfangjäger, die ein Bearer Token anhängt (gespeichert in $window.sessionsStorage) mit dem Header, so dass REST API-Anfragen authentifiziert werden kann:

function accessTokenHttpInterceptor($window, $http) { 

    // Try to get token details from sessionStorage 
    var accesstoken=$window.sessionStorage.getItem('userInfo-accesstoken'); 
    var refreshtoken=$window.sessionStorage.getItem('userInfo-refreshtoken'); 
    var tokenexpiry=$window.sessionStorage.getItem('userInfo-tokenexpiry'); 

    return { 

    request: function($config) { 

     // Check if the access token, refresh token and expiry date exists: 
     if (accesstoken == undefined || refreshtoken == undefined || tokenexpiry == undefined) { 
     console.log('Missing token details'); 
     // TODO REDIRECT TO LOGIN PAGE 
     } 

     // We have an access token. Has it expired? 
     var expiry = new Date($window.sessionStorage['userInfo-tokenexpiry']) 
     var now = new Date 
     if (now > expiry) { 
     console.log('Token expired'); 
     // TODO REFRESH THE TOKEN 
     }; 

     // Set the authorization header 
     $config.headers['Authorization'] = 'Bearer ' + accesstoken; 
     return $config; 

    }, 
    }; 
} 

accessTokenHttpInterceptor.$inject=['$window']; 

function httpInterceptorRegistry($httpProvider) { 
    $httpProvider.interceptors.push('accessTokenHttpInterceptor'); 
} 

angular 
    .module('myApp') 
    .config(httpInterceptorRegistry) 
    .factory('accessTokenHttpInterceptor', accessTokenHttpInterceptor) 

Wie Sie sehen können, ich bin in der Lage zu sehen, ob das Token an die API, um den Anruf zu machen, bevor abgelaufen ist.

Kann jemand mir helfen, wie das Token vor der Herstellung der eigentlichen API-Anfrage zu aktualisieren? Ich würde denken, dass eine weitere $ http-Anfrage erneut abgefangen würde und in einer Endlosschleife enden würde. Das Token wird aktualisiert, indem eine POST-Anforderung an die API gesendet wird, wobei das Aktualisierungstoken als Parameter übergeben wird und nicht wie andere API-Anforderungen im Autorisierungsheader.

Antwort

1

Sie könnten die URL der Anfrage überprüfen, um eine Endlosschleife zu verhindern. Anstatt die Config direkt zurückzugeben, können Sie auch eine Zusage zurückgeben, die damit verrechnet wird, so dass Sie warten können, bis Sie ein gültiges Token haben. z.B.

{ 
    request: function(config) { 
     if(config.url != 'my/refresh/url') { 
      var promiseToHaveValidToken; 

      var expiry = new Date($window.sessionStorage['userInfo-tokenexpiry']); 
      var now = new Date(); 
      if (now > expiry) { 
       promiseToHaveValidToken = $http.get('my/refresh/url').then(function (response) { 
        return response.data.token; 
       }); 
      } else { 
       promiseToHaveValidToken = $q.resolve(sessionStorage['userInfo-accesstoken']); 
      } 

      return promiseToHaveValidToken.then(function (token) { 
       config.headers['Authorization'] = 'Bearer ' + token; 
       return config; 
      }); 
     } 
    } 
}