我正在使用Angular / Typescript。该应用程序与API通信,access_token
存储在存储器中。
在每个请求上,拦截器都会检查access_token
是否仍然有效。
当access_token过期时,应用程序需要使用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() {
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();
});
});
}
答案 0 :(得分:0)
第一句话是在克隆请求时为该请求创建一个新的const,而不是将其分配给旧的const。
我认为问题是当您调用reLogin并期望在then
中可以访问带有更新令牌的新请求时。但是您仍然处于旧的request
的上下文中。因此,您可能应该从access_token
返回reLogin
,然后再将其设置在请求的克隆上。