Мне нужно добавить x-CSRF-токен и авторизацию в запрос заголовка.
Для токена авторизации он хранится в моем локальном хранилище.
Но для x-CSRF-токена , мне нужно сделать запрос на мой веб-сервер.
Вот мой метод перехвата:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loadingService.present();
if(request.url != "/rest/session/token")
{
return from(this.handleAccess(request, next)).pipe(
map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
this.loadingService.dismiss();
}
return event;
}),
catchError((err: HttpErrorResponse) => {
this.loadingService.dismiss();
if ((err.status === 401 || err.status === 403) && this.router.url !== '/login'){
this.storageService.setUid("");
this.router.navigate(['/login']);
}
return throwError(err);
}));;
}else{
return next.handle(request);
}
}
Здесь мой метод handleAccess:
private getXCRFToken()
{
console.log('call');
return this.httpClient.get(environment.server_rest+'/rest/session/token').pipe(
tap( (res) => {
console.log(res);
return res;
})
);
}
private async handleAccess(request: HttpRequest<any>, next: HttpHandler):
Promise<HttpEvent<any>> {
const token = await this.storageService.getTokenApi().toPromise();
const tokenXcrf = await this.getXCRFToken().toPromise();
console.log(tokenXcrf);
let changedReq;
if (token) {
changedReq = request.clone({
headers: new HttpHeaders({
'Authorization': 'Bearer ' + token,
'X-CSRF-Token': tokenXcrf,
})
});
}else{
console.log('basic');
changedReq = request.clone({
headers: new HttpHeaders({
'Authorization': "Basic " + btoa("zzz:zzzz"),
'X-CSRF-Token': tokenXcrf,
})
});
}
return next.handle(changedReq).toPromise();
}
Это порядок запроса:
/ code => POST
/ rest / session / token => GET
Код / запускает перехватчик и мой handleAccess.
Но как только этот метод вызывается:
const tokenXcrf = await this.getXCRFToken (). ToPromise (); (/ rest / session / token)
Interceptor ll запускается снова, но я пропускаю этот URL.
Но мой первый / код забыт, и мое приложение остается на / rest / session / token и остальная часть моего метода handleAcess никогда не будет выполнена.
Если я удалю этот вызов из своего handleAccess:
const tokenXcrf = await this.getXCRFToken().toPromise();
вызов / код моего приложения, но я получил ошибка X-CSRF-Token отсутствует.
Когда другой запрос запускает перехватчик, я потерял первый перехватчик?
Что мне не хватает?