Angular 截击机

Angular 截击机,angular,typescript,Angular,Typescript,您好我在Angular 9中实现了一个拦截器,当捕获idtoken不正确时,它会生成新的令牌,但不会再次发送请求,拦截器代码如下: import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; import { Observable } from 'rxjs'; impo

您好我在Angular 9中实现了一个拦截器,当捕获idtoken不正确时,它会生成新的令牌,但不会再次发送请求,拦截器代码如下:

import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
import { AuthService } from 'src/app/services/auth.service';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  constructor(private auth:AuthService) {}
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    console.log ("solicitud interceptada correctamente!"); 
    let data = JSON.parse(localStorage.getItem('data'));
    let refreshToken = data['data'].refreshToken;
    console.log('refreshToken',refreshToken);

    return next.handle(request).pipe(catchError(err => {
      console.log(err.error);
      if (err.error.code === 401) {
        console.log('Refresh Token');
          if (err.error.message == "Token no valido.") {
            console.log('Refresh Token');
            let refresh={
              "refreshToken":refreshToken
            }
            this.auth.getTokenRefresh(refresh)
            .subscribe(respt =>{
              // this.datar['data'].refreshToken=respt['data'].refreshToken;
              data['data'].idToken=respt['data'].idToken;
              data['data'].accessToken=respt['data'].accessToken;

              this.auth.guardarToken(respt['data'].idToken);
              this.auth.guardarRespuesta(data);
              console.log(respt);
              console.log("Datos Refrescar",data);
              console.log("Id token Refrescar",respt['data'].idToken);

              request = request.clone({ 
              setHeaders: { 
                'Application': 'UEhBTlRPTVhfV0VC',
                'Authorization': `Bearer ${respt['data'].idToken}` 
              } 
              });   
              // this.router.navigate(['/seguridad/gestion-usuarios']);
            },(err) =>{
              // this.error=err.error['message'];
              // this.erroru=true;
              console.log(err.error);
            });
            return next.handle(request); 
              //TODO: Token refreshing
          }else {
              //Logout from account or do some other stuff
          }
      }
      return next.handle(request); 
      // return next.handle(request);
    }));
    
  }
}
从'@angular/core'导入{Injectable};
进口{
HttpRequest,
HttpHandler,
HttpEvent,
http拦截器
}来自“@angular/common/http”;
从“rxjs”导入{Observable};
从“rxjs/operators”导入{catchError};
从“rxjs”导入{throwError};
从'src/app/services/auth.service'导入{AuthService};
@可注射()
导出类AuthInterceptor实现HttpInterceptor{
构造函数(私有身份验证:身份验证服务){}
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
console.log(“requickud interceptada correctamente!”);
让data=JSON.parse(localStorage.getItem('data'));
让refreshToken=data['data'].refreshToken;
log('refreshToken',refreshToken);
返回next.handle(request).pipe(catchError(err=>{
console.log(err.error);
如果(err.error.code==401){
log(“刷新令牌”);
if(err.error.message==“令牌无效”){
log(“刷新令牌”);
让我们刷新={
“refreshToken”:refreshToken
}
this.auth.getTokenRefresh(刷新)
.订阅(respt=>{
//this.datar['data'].refreshtToken=respt['data'].refreshtToken;
data['data'].idToken=respt['data'].idToken;
data['data'].accessToken=respt['data'].accessToken;
this.auth.guardarToken(respt['data'].idToken);
此.auth.guardarrepuesta(数据);
控制台日志(respt);
console.log(“Datos Refrescar”,数据);
log(“Id token Refrescar”,respt['data'].idToken);
request=request.clone({
集合头:{
“应用程序”:“UEhBTlRPTVhfV0VC”,
'Authorization':`Bearer${respt['data'].idToken}`
} 
});   
//this.router.navigate(['/seguridad/gestion usuarios']);
},(错误)=>{
//this.error=err.error['message'];
//这个.erroru=true;
console.log(err.error);
});
下一步返回。处理(请求);
//TODO:令牌刷新
}否则{
//从帐户注销或做一些其他事情
}
}
下一步返回。处理(请求);
//下一步返回。处理(请求);
}));
}
}

我知道“return next.handle(request);”会再次生成请求,但我不知道为什么没有生成请求,我已经进行了大量调查,但没有找到解决方案,我希望您能提供帮助,直到刷新令牌API返回响应。如果您不知道如何在继续下一行代码之前等待http响应,请阅读“forkJoin”中的“async and wait”一词。

我该如何做?我在等待方面没有太多经验