我有一个基于令牌的认证机制的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