Tôi có một API có cơ chế xác thực dựa trên mã thông báo. Sau khi đăng nhập thành công, tôi lưu trữ hai thẻ trong bộ nhớ cục bộ của trình duyệt - mã thông báo truy cập và làm mới. Mã thông báo truy cập chứa tất cả thông tin cần thiết cần thiết để ủy quyền cho người dùng ở phía máy chủ và có ngày hết hạn. Khi mã thông báo truy cập hết hạn, máy khách có thể yêu cầu mã thông báo truy cập mới sử dụng mã thông báo làm mới và trong phản hồi, mã thông báo sẽ nhận được một cặp mã thông báo mới.Angular2 http retry logic
Trong góc 1.x việc triển khai khá đơn giản và dễ hiểu. Ví dụ chúng ta có thể sử dụng tên lửa đánh chặn:
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);
}
};
}
}
Nhưng làm thế nào để thực hiện logic tương tự ở góc 2 app/rxjs?
aproach của bạn cũng giống như tôi ... Vấn đề duy nhất đối với tôi là yêu cầu song song. Nếu tôi đăng ký 3 yêu cầu http khác nhau ... thì mọi yêu cầu sẽ có cùng mã thông báo. chỉ số đầu tiên sẽ làm mất hiệu lực mã thông báo và 2 yêu cầu http khác sẽ không thành công. Bất kỳ đề xuất? – Michalis