我正在尝试使用HttpInterceptor编写我的第一个代码来捕获401错误。我想要做的是根据条件创建一个新的身份验证令牌然后重试。但是目前我的代码进行了重试,但它是在创建新的身份验证令牌之前完成的。这是我的代码:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
return next.handle(request).catch(error => {
if (error.status === 401) {
console.log('401 error');
//check for valid refresh token
let refreshToken = localStorage.getItem('refresh_token');
this._refreshTokenService.getRefreshToken(refreshToken).subscribe(
refreshToken => {
if (refreshToken != null) {
console.log('valid refresh token')
//if valid refresh token, relogin and create new auth token
console.log(localStorage.getItem('auth_token'));
this._userService.logout();
let email = localStorage.getItem('profile_email');
this._userService.autoLogin(email)
.subscribe(
result => {
if (result) {
console.log('new auth token created');
let auth_token = localStorage.getItem('auth_token');
//retry
request = request.clone({ headers: request.headers.set('Authorization', `Bearer ${auth_token}`) });
}
});
}
else {
console.log('invalid refresh token');
}
});
return next.handle(request);
}
else {
console.log(error.status);
}
});
}
我仍然熟悉Typescript语法,我想我只需要在创建新令牌后进行重试,但我不确定这种情况下的确切语法。任何帮助将不胜感激!
答案 0 :(得分:0)
抱歉,我无法在评论中回复。 我想这就是链接Observable。
基本上,您在上一次return next.handle(request);
之前调用的所有内容都会在进行http调用之前得到处理。
除了this._refreshTokenService.getRefreshToken(refreshToken).subsribe()
内的所有内容都将被异步处理。
你应该像这样链接你的Observable:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
return next.handle(request).catch(error => {
return this._refreshTokenService.getRefreshToken(refreshToken).subscribe(
refreshToken => {
return next.handle(request);
}
);
});
}