Я работаю над приложением, используя аутентификацию токена с токеном обновления. Я успешно реализовал токен аутентификации и обновления в angular v1 в веб-приложении. В приложении ionic 3, использующем angular v5, я также реализовал этот процесс. Он успешно получает новый токен с помощью токена обновления. Но проблема в том, что он не вызывает последний запрос снова.
вот моя реализация перехватчика Http.
@Injectable()
export class HttpsRequestInterceptor implements HttpInterceptor {
isRefreshingToken: boolean = false;
tokenSubject: BehaviorSubject<string> = new BehaviorSubject<string>(null);
constructor(
private injector : Injector
) {
}
addToken(req: HttpRequest<any>, token: string): HttpRequest<any> {
return req.clone({ setHeaders: { Authorization: 'Bearer ' + token }})
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
const authenticationService = this.injector.get(AuthenticationService);
let user : AuthenticatedUser = authenticationService.getUser1();
console.log("token", (user)? user.token : null);
let dupReq: HttpRequest<any>;
if (user && req.urlWithParams.indexOf("/token") < 0) {
dupReq = this.addToken(req, user.token);
} else {
dupReq = req;
}
return next.handle(dupReq).pipe(
tap(event => {
if (event instanceof HttpResponse) {
console.log(`Request for ${dupReq.urlWithParams} return status text : ${event.statusText} .`);
}
}, error => {
if (error instanceof HttpErrorResponse) {
switch ((<HttpErrorResponse>error).status) {
case 401:
return this.handle401Error(dupReq, next);
}
} else{
return Observable.throw(error);
}
})
)
}
handle401Error(req: HttpRequest<any>, next: HttpHandler) {
if (this.isRefreshingToken == false) {
this.isRefreshingToken = true;
this.tokenSubject.next(null);
const authenticationService = this.injector.get(AuthenticationService);
return authenticationService.refreshToken().then((result: ResultSet) =>{
this.isRefreshingToken = false;
if (result.isSuccess) {
console.log(result.message, result.model.token);
let user: AuthenticatedUser = result.model;
this.tokenSubject.next(user.token);
return next.handle(this.addToken(req, user.token));
}
// TODO logout.
}).catch((error: ResultSet) =>{
this.isRefreshingToken = false;
// TODO logout.
});
} else {
return this.tokenSubject
.filter(token => token != null)
.take(1)
.switchMap(token => {
return next.handle(this.addToken(req, token));
});
}
}};
Кто-нибудь знает, почему перехватчик не повторяет последний запрос снова.
Спасибо
tap
? вы должны использоватьcatchError
для этого.. - person Suraj Rao   schedule 21.07.2018