我有一個基於令牌的認證機制的API。成功登錄後,我在瀏覽器的本地存儲中存儲兩個令牌 - 訪問和刷新令牌。 訪問令牌包含在服務器端授權用戶所需的所有必要信息,並且它具有到期日期。 訪問令牌過期時,客戶端可以使用刷新令牌請求新的訪問令牌,並在響應中獲得一對新的令牌。Angular2 http重試邏輯
在angular 1.x中,實現非常簡單直接。例如,我們可以使用攔截器:
httpInterceptor.$inject = ['$httpProvider'];
function httpInterceptor($httpProvider) {
$httpProvider.interceptors.push(handleStaleAccessToken);
handleStaleAccessToken.$inject = ['$q', '$injector', 'session'];
function handleStaleAccessToken($q, $injector, session) {
function logoutAndRedirect() {
var authenticationRedirect = $injector.get('authenticationRedirect');
session.destroy();
authenticationRedirect.toLoginPage();
}
return {
responseError: function(rejection) {
// Do nothing for non 403 errors
if (rejection.status !== 403) {
return $q.reject(rejection);
}
var errorCode = rejection.data.error && rejection.data.error.code;
if (errorCode === 'access_token_expired') {
var $http = $injector.get('$http');
// Refresh token
var params = { refreshToken: session.getRefreshToken() };
return $http.post('/api/auth/refresh', params).then(function(response) {
session.setTokens(response.data);
// Re try failed http request
return $http(rejection.config);
}).catch(function(error) {
logoutAndRedirect();
return $q.reject(error);
});
} else {
logoutAndRedirect();
}
return $q.reject(rejection);
}
};
}
}
但是如何在角度2/rxjs應用程序中實現類似的邏輯?
你的aproach是我的一樣......對我來說,唯一的問題是並行的請求。如果我訂閱3個不同的http請求...則每個請求都有相同的標記。第一個將使標識失效,另外兩個http請求將失敗。有什麼建議麼? – Michalis