मैंने एपीआई के साथ काम कर एक कोणीय जेएस वेबसाइट बनाई है। यह एपीआई प्रमाणीकरण (ओथ) जैसी कुछ विशेषताएं प्रदान करता है।इंटरसेप्टर में अनंत लूप
जब एपीआई 401 त्रुटि देता है, तो इसका मतलब है कि access_token
की समयसीमा समाप्त हो गई है और इसे refresh_token
के साथ रीफ्रेश करने की आवश्यकता है।
मैंने AngularJS में एक इंटरसेप्टर बनाया है। इसका लक्ष्य यह जांचना है कि एपीआई द्वारा दिया गया परिणाम 401 त्रुटि है और यदि यह मामला है, तो उसे टोकन रीफ्रेश करना होगा और फिर, पिछले अस्वीकृत अनुरोध को संसाधित करना होगा।
समस्या यह है कि इंटरसेप्टर एक अनंत लूप बनाता है। प्रारंभिक अनुरोध की दूसरी विफलता के बाद, इसे रोकना चाहिए लेकिन ऐसा नहीं है।
angular.module('myApp')
.factory('authInterceptor', function ($rootScope, $q, $window, $injector) {
return {
// If the API returns an error
'responseError' : function(rejection) {
// If it's a 401
if (rejection.status == 401) {
var deferred = $q.defer();
$injector.get('$http').post('http://my-api.local/api/oauth/token', {
grant_type : 'refresh_token',
client_id : 'id',
client_secret : 'secret',
refresh_token : $window.sessionStorage.refresh_token
}, {
headers : {
'Content-Type' : 'application/x-www-form-urlencoded'
},
transformRequest : function(obj) {
var str = [];
for(var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
return str.join("&");
}
})
// New token request successfull
.success(function(refreshResponse) {
// Processing the failed request again (should fail again because I didn't saved the new tokens)
$injector.get('$http')(rejection.config).success(function(data) {
deferred.resolve(data);
})
.error(function(error, status) {
deferred.reject();
});
return deferred.promise();
})
// New token request failure
.error(function(error, status) {
deferred.reject();
// $location.path('users/login');
return;
});
}
// If it's another errorenter code here
else
return rejection;
}
}
});
तो यह कोड:
- शुरू होता है जब पहली अनुरोध विफल रहता है
- अनुरोध ताज़ा टोकन
- पुनर्प्रयास लेकिन फिर से विफल रहता है (< - मैं सिर्फ यह यहाँ रोक बनाना चाहते)
- टोकन को रीफ्रेश करता है
- अनुरोध को पुनः प्रयास करता है लेकिन फिर से विफल रहता है
- अनुरोध ताज़ा टोकन
- पुनर्प्रयास लेकिन फिर से विफल रहता है
- आदि ...
यह सही नहीं दिख रहा है: 'वापसी deferred.promise(); '। आपको केवल वादे ऑब्जेक्ट 'वापसी deferred.promise' वापस करना चाहिए और इसे निष्पादित करने की कोशिश नहीं करनी चाहिए। – user2943490