【发布时间】:2016-04-15 16:35:12
【问题描述】:
我有一个基于令牌的身份验证机制的 API。成功登录后,我在浏览器的本地存储中存储了两个令牌 - 访问和刷新令牌。 访问令牌包含在服务器端授权用户所需的所有必要信息,并且它具有到期日期。 当访问令牌过期时,客户端可以使用刷新令牌请求新的访问令牌,并在响应中获得一对新令牌。
在 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);
}
};
}
}
但是如何在 angular 2 / rxjs app 中实现类似的逻辑呢?
【问题讨论】:
标签: javascript http angular rxjs