Я использую Angular / Typescript. Приложение связывается с API, access_token
хранится в хранилище.
При каждом запросе перехватчик проверяет, все ли действительное access_token
.
Когда истекает access_token, приложение должно обновить sh access_token
с помощью refresh_token
и продолжить работу с последним запросом (с новым access_token
)
Проблема Не удается получить клонирование исходный запрос (с токеном с истекшим сроком) и выполнить его. Вызов для запроса нового access_token
мешает перехватчику. Как лучше всего:
- Запросить новый токен.
- Установить новый токен.
- Возобновить вызов с токеном с истекшим сроком действия и клоном для запуска. успешно?
Перехватчик:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// add authorization header with jwt token if available
if (!this.isRefreshing) {
if (this.authenticationService.checkLoginState()) {
// Check if access_token is valid.
this.currentUser = JSON.parse(localStorage.getItem('auth'));
if (new Date(this.currentUser.access_token_expires) > new Date()) {
// Access token is valid, clone request and continue.
request = request.clone({
setHeaders: {
Authorization: `Bearer ${this.currentUser.access_token}`
}
});
return next.handle(request);
} else {
// Token is not valid, request new token with reLogin().
this.reLogin().then(any => {
// New token has been set, now run old request with new token.
return next.handle(request);
}, error => {
this.authenticationService.logout();
});
}
}
} else {
return next.handle(request);
}
}
reLogin:
reLogin() {
return new Promise(function (resolve, reject) {
this.isRefreshing = true;
// Check if refresh token is valid
if (new Date(this.currentUser.refresh_token_expires) > new Date()) {
this.authenticationService.loginWithRefreshToken(this.currentUser.refresh_token).subscribe(data => {
// Using refresh_token was successful
this.currentUser = JSON.parse(localStorage.getItem('auth'));
this.isRefreshing = false;
resolve();
}, error => {
console.error(error);
reject();
});
});
}