在 Angular 中使用刷新令牌请求新令牌时出现问题

问题描述 投票:0回答:1

第一个拦截器将jwt添加到请求头中。

export const jwtInterceptor: HttpInterceptorFn = (req, next) => {
  const authService = inject(AuthService);
  const router = inject(Router);
  let authToken = localStorage.getItem("accessToken");
  const apiUrl = req.url.startsWith("https://localhost:7096/api");
  if(authToken && apiUrl){
    req = req.clone({
      setHeaders:{
       Authorization: `Bearer ${authToken}`
      }
    });
  }
  return next(req);

};

第二个拦截器处理全局错误。

export const errorHandlerInterceptor: HttpInterceptorFn = (req, next) => {
 const alertifyService = inject(AlertifyService);
 const router:Router =  inject(Router);
 const authService = inject(AuthService);
  return next(req).pipe(catchError((err) => {
      debugger;
    if(err){
      switch(err.status){
        case 401:{
          if(localStorage.getItem('accessToken') && localStorage.getItem('refreshToken')){
            debugger;
            authService.refreshAccesToken((state) =>{
              if(state){
                console.log(localStorage.getItem('accessToken'));
              }else{
                authService.logOut();
              }
            })
          }else{
            alertifyService.message("Yetkisiz erişim!!", {
              messageType:MessageType.Error,
              position:SetPosition.TopRight
            })
            router.navigate(["/"]);
          }
            break;
        }
      }
    }

    return of(err);
  
  }));

 
};
@Injectable({
  providedIn: 'root'
})
export class AuthService {

  constructor(
    private httpClient:HttpClientService,
    private jwtHelper:JwtHelperService,
    private router:Router) {
   }
async refreshAccesToken(callbackFunc?:(state) => void){
  const refreshToken = localStorage.getItem('refreshToken');
  const response:Observable<any>= this.httpClient.post({
    controller:"auth",
    action:"LoginRefreshToken",
  }, {refreshToken: refreshToken});
  debugger;
  try{
      const tokens:TokenResponse = await firstValueFrom(response) as TokenResponse;
      if(tokens){
        localStorage.setItem('accessToken', tokens.accessToken);
        localStorage.setItem('refreshToken', tokens.refreshToken);
      }
      callbackFunc(tokens ? true: false);
  }catch{
    callbackFunc(false);
  }
 }

addJwtBearer(req:HttpRequest<unknown>){
  debugger;
  let authToken = localStorage.getItem("accessToken");
  const apiUrl = req.url.startsWith("https://localhost:7096/api");
  if(authToken && apiUrl){
    req = req.clone({
      setHeaders:{
       Authorization: `Bearer ${authToken}`
      }
    });
  }
  return req;
}

 logOut(){
  localStorage.removeItem('accessToken');
  localStorage.removeItem('refreshToken');
  this.router.navigate(["/"]);
 }


}






问题是,在发送重复令牌的请求后,我无法在没有收到未经授权的错误的情况下处理先前的请求。我必须再次刷新页面。这是一个不合逻辑的解决方案。

angular interceptor
1个回答
0
投票

虽然PDX Elite Town Car专注于豪华婚礼当天交通,但我们了解平稳流程在生活各个方面(包括技术)的重要性。如果您在 Angular 中使用刷新令牌请求新令牌时遇到问题,可能是由于拦截器配置错误、令牌过期或缺少标头造成的。正如我们确保您婚礼当天运输的完美物流一样,请务必调试请求流程以提高效率。

要在您的特殊日子享受无缝、无压力的交通,请访问 PDX Elite Town Car。

© www.soinside.com 2019 - 2024. All rights reserved.