2017-05-12 15 views
7

मैं थोड़ी देर के लिए काम करने के लिए अपना रीफ्रेश टोकन प्राप्त करने का प्रयास कर रहा हूं, और मुझे उम्मीद है कि मैं करीब हूं। मेरा टोकन रीफ्रेश करता है और बाद में 200 कॉल को ट्रिगर करता है जो भी कॉल 401 के कारण होता है, लेकिन मेरे पेज पर मेरा डेटा रीफ्रेश नहीं होता है।रीफ्रेश टोकन रीफ्रेश के बाद डेटा रीफ्रेश कैसे करें jwt

जब एक पहुँच टोकन समाप्त हो रहा है, निम्न होता है:

enter image description here

401 के बाद, GetListofCompanyNames सही अद्यतन पहुँच टोकन का उपयोग कर नामों की सूची के साथ 200 देता है। हालांकि, मेरा ड्रॉपडाउन रीफ्रेश नहीं होता है।

मेरे इंटरसेप्टर:

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); 
      } 
     }; 
    } 
]); 

401 अस्वीकृति पर मेरे वापसी कथन यहाँ संदिग्ध लग रहा है, लेकिन मुझे यकीन है कि क्या इसके साथ बदलने के लिए नहीं कर रहा हूँ। इस प्रकार मेरा सवाल है: जब मैं नई कॉल करता हूं तो मैं अपने डेटा को रीफ्रेश करने के लिए अपना पृष्ठ कैसे प्राप्त कर सकता हूं?

अद्यतन:

यह मैं अतीत जब 200 रिटर्न और मैं एक लटकती ताज़ा करने के लिए प्राप्त कर सकते हैं हो जाता है, लेकिन मैं नीचे के साथ (पूर्व चयनित लटकती।) पृष्ठ पर किसी भी राज्य खो देते हैं।

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

ड्राइंग बोर्ड पर वापस जाएं!

+0

क्या आप एक कोणीय राउटर सिस्टम का उपयोग करते हैं? –

+0

हाँ, यूई-राउटर: https://github.com/angular-ui/ui-router – RandomUs1r

+0

क्या आपने अपनी 'authInterceptorService' में $ राज्य सेवा इंजेक्ट करने का प्रयास किया था और 'state.reload()' का उपयोग किया था? –

उत्तर

0

मेरे अंतिम समाधान:

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; 
      } 
     }; 
    } 
]); 

https://github.com/tjoudeh/AngularJSAuthentication/blob/master/AngularJSAuthentication.Web/app/services/authInterceptorService.js से लगभग 1 1 के लिए कॉपी किया गया।

यह एक पारदर्शी रूप से सभी अनुरोधों को संभालता है और आवश्यक होने पर उन्हें रीफ्रेश करता है। यह रीफ्रेश टोकन की समयसीमा समाप्त होने पर उपयोगकर्ताओं को लॉग आउट करता है और नियंत्रकों के साथ त्रुटियों को ठीक से अस्वीकार कर देता है। हालांकि, यह उड़ान अनुरोधों में एकाधिक के साथ काम नहीं कर रहा प्रतीत होता है, जब मैं अपने सिस्टम में इसके लिए उपयोग केस प्राप्त करता हूं तो मैं उसमें देखता हूं।

1

मुझे लगता है कि आप इसे बदलना चाहते हैं कि आप इसके बारे में कैसे जाते हैं। इसके बारे में जाने का एक तरीका आपके रूटर्सकोप को authInterceptorService में इंजेक्ट करना होगा और फिर एक बार सफलतापूर्वक टोकन रीफ्रेश करने के बाद, $rootScope.broadcast('tokenRefreshed') जैसे कुछ कॉल करें।

मैं काफी है कि कैसे आप देख सकते हैं और नियंत्रक है कि आपके लटकती संभालती है की स्थापना की है पता नहीं है, लेकिन मुझे लगता है कि 'tokenRefreshed' घटना के लिए एक श्रोता की स्थापना की जाएगी। यहां से, आप पर एक और कॉल कर सकते हैं। यदि आप ऐसा करते हैं तो आप आसानी से नियंत्रण कर सकते हैं और यह सुनिश्चित कर सकते हैं कि मॉडल अपडेट हो जाए।

2

$timeout में अपना पुनः प्रयास कॉल करने का प्रयास करें, इसे काम करना चाहिए।

यहाँ अद्यतन कोड है:

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); 
      } 
     }; 
    } 
]); 

$ टाइमआउट एक वादा है कि क्या समारोह पैरामीटर से दिया जाता है के साथ पूरा हो गया है देता है, तो हम आसानी से बस लौट सकते हैं $ http कॉल $ में लिपटे समय समाप्त।

धन्यवाद।

संबंधित मुद्दे