Машинопись перехватчика - PullRequest
0 голосов
/ 12 июля 2020

Мне нужно добавить 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 отсутствует.

Когда другой запрос запускает перехватчик, я потерял первый перехватчик?

Что мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...