2017-05-12 77 views
7

Próbowałem od teraz uzyskać token odświeżania i mam nadzieję, że jestem blisko. Mój token odświeża i wyzwala kolejne 200 wywołań do wywołania 401, ale moje dane na mojej stronie nie odświeżają się.Odświeżanie danych po odświeżeniu tokenu powoduje odświeżenie jwt

Kiedy wygasa token dostępu, dodaje się dzieje:

enter image description here

Po 401 The GetListofCompanyNames zwraca 200 z listą nazw przy użyciu poprawnej zaktualizowaną token dostępu. Jednak moje rozwijanie się nie odświeża.

Moja przechwytujących:

app.factory('authInterceptorService',['$q', '$location', 'localStorageService', '$injector', function($q, $location, localStorageService, $injector) { 
     return { 
      request: function(config) { 

       config.headers = config.headers || {}; 

       var authData = localStorageService.get('authorizationData'); 
       if (authData) { 
        config.headers.Authorization = 'Bearer ' + authData.token; 
       } 
       return config; 
      }, 
      responseError: function(rejection) { 
       //var promise = $q.reject(rejection); 
       var authService = $injector.get('authService'); 
       if (rejection.status === 401) { 

        // refresh the token 
        authService.refreshToken().then(function() { 
         // retry the request 
         var $http = $injector.get('$http'); 
         return $http(rejection.config); 
        }); 
       } 
       if (rejection.status === 400) { 
        authService.logOut(); 
        $location.path('/login'); 
       } 
       return $q.reject(rejection); 
      } 
     }; 
    } 
]); 

Moje oświadczenie powrót na odrzucenie 401 wygląda podejrzany tutaj, ale nie jestem pewien, co go zastąpić. W związku z tym moje pytanie brzmi: w jaki sposób mogę uzyskać moją stronę, aby odświeżyć dane, kiedy wykonuję nowe połączenie?

Aktualizacja:

to dostaje mnie przeszłość, kiedy 200 powraca i mogę dostać rozwijana do odświeżenia, ale tracę dowolny stan na stronie (ex wybrany rozwijanej.) Z niżej.

authService.refreshToken().then(function() { 
var $state = $injector.get('$state'); 
$state.reload(); 
}); 

Powrót do deski kreślarskiej!

+0

Czy korzystasz z systemu routera angularjs? –

+0

Tak, ui-router: https://github.com/angular-ui/ui-router – RandomUs1r

+0

Czy próbowałeś wprowadzić usługę $ state w swoim 'authInterceptorService' i użyć' $ state.reload() '? –

Odpowiedz

0

Moje ostateczne rozwiązanie:

app.factory('authInterceptorService', ['$q', '$location', 'localStorageService', '$injector', function($q, $location, localStorageService, $injector) { 
     var $http; 
     var retryHttpRequest = function(config, deferred) { 
      $http = $http || $injector.get('$http'); 
      $http(config).then(function(response) { 
        deferred.resolve(response); 
       }, 
       function(response) { 
        deferred.reject(response); 
       }); 
     } 

     return { 
      request: function(config) { 

       config.headers = config.headers || {}; 

       var authData = localStorageService.get('authorizationData'); 
       if (authData) { 
        config.headers.Authorization = 'Bearer ' + authData.token; 
       } 
       return config; 
      }, 
      responseError: function(rejection) { 
       var deferred = $q.defer(); 
       if (rejection.status === 401) { 
        var authService = $injector.get('authService'); 
        authService.refreshToken().then(function() { 
          retryHttpRequest(rejection.config, deferred); 
         }, 
         function() { 
          authService.logOut(); 
          $location.path('/login'); 
          deferred.reject(rejection); 
         }); 
       } else { 
        deferred.reject(rejection); 
       } 
       return deferred.promise; 
      } 
     }; 
    } 
]); 

Skopiowane prawie 1 do 1 z https://github.com/tjoudeh/AngularJSAuthentication/blob/master/AngularJSAuthentication.Web/app/services/authInterceptorService.js.

Ten transparentnie obsługuje wszystkie żądania i odświeża je w razie potrzeby. Wylogowuje użytkowników po wygaśnięciu tokena odświeżania i przekazuje błędy do kontrolerów, odpowiednio je odrzucając. Jednak wydaje się, że nie działa z wieloma w żądaniach lotu, przyjrzę się temu, kiedy dostanę przypadek użycia w moim systemie.

1

Myślę, że możesz zmienić sposób, w jaki to robisz. Jednym ze sposobów obejścia tego problemu byłoby wstrzyknięcie $ rootScope do Twojego authInterceptorService, a po pomyślnym odświeżeniu tokenu, wywołaj coś takiego jak $rootScope.broadcast('tokenRefreshed').

Nie wiem, w jaki sposób skonfigurowałeś widok i kontroler obsługujący twoje rozwijanie, ale skonfigurowałbym słuchacza dla tego zdarzenia 'tokenRefreshed'. Stąd możesz wykonać kolejne połączenie z . Jeśli robisz to w ten sposób, możesz łatwo kontrolować i zapewniać aktualizację modelu.

2

Spróbuj przerwać połączenie próbne pod numerem $timeout, powinno działać.

Oto zaktualizowany kod:

app.factory('authInterceptorService',['$q', '$location', 'localStorageService', '$injector', function($q, $location, localStorageService, $injector) { 
     return { 
      request: function(config) { 

       config.headers = config.headers || {}; 

       var authData = localStorageService.get('authorizationData'); 
       if (authData) { 
        config.headers.Authorization = 'Bearer ' + authData.token; 
       } 
       return config; 
      }, 
      responseError: function(rejection) { 
       //var promise = $q.reject(rejection); 
       var authService = $injector.get('authService'); 
       if (rejection.status === 401) { 

        // refresh the token 
        authService.refreshToken().then(function() { 
         // retry the request 
        return $timeout(function() { 
         var $http = $injector.get('$http'); 
         return $http(rejection.config); 
        }}); 
       } 
       if (rejection.status === 400) { 
        authService.logOut(); 
        $location.path('/login'); 
       } 
       return $q.reject(rejection); 
      } 
     }; 
    } 
]); 

$ Timeout zwraca obietnicę, że zakończy się to, co jest zwracana od parametru funkcji, dzięki czemu możemy wygodnie po prostu zwracają $ http nazywamy owinięty w $ koniec czasu.

Dzięki.