Vyhledávání na webu

javascript - Jak zachytit odchozí HTTP volání a nastavit JWT token v mikroslužbě Nestjs


Vyvíjím mikroservis Nestjs a potřebuji parsovat příchozí JWT v požadavku pro odchozí HTTP požadavky, ale zdá se, že na to není čistší způsob, nebo něco přehlížím? Toto je to, co jsem zatím udělal.

Poznámka: Používání http klienta nestjs axios

user.contoller.ts

@Controller('/users')
export class UserController {
   constructor(private userService: userService,
      private vehicleService: VehicleService){}

   @Post()
   create(@Req() req: Request, @Body() userData: userData) {
    // I can get the JWT token from here
    // fetch some data from different micro-service
     const d = this.vehicleService.getVehicleById(userData.vehicleId, req.headers['authorization'])
    // save user
   }
}

vozidlo.servis.ts

@Injectable() export class VehicleService { basePath=http://ms-vehicles/api/v1/vehicles;

  constructor(private httpService: HttpService) {}

  getVehicleById(vehicleId: string, token: string) {
    return this.httpSerice.get(this.basePath + '/' + vehicleId,
     {headers: {Authorization: token});
  }
}

Můžeme zachytit odchozí HTTP volání pomocí interceptoru Axios, ale jak tam můžu nastavit správný token, aniž by se token předával přes kontroler a službu jako parametr

Našel jsem níže uvedené řešení na Stack Overflow a nejsem si jistý, jestli je to správný způsob, jak to udělat.

interceptor

@Injectable()
export class HttpServiceInterceptor implements NestInterceptor {
  constructor(private httpService: HttpService) {}
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
  
    // ** if you use normal HTTP module **
    const ctx = context.switchToHttp();
    const token = ctx.getRequest().headers['authorization'];

    // ** if you use GraphQL module **
    const ctx = GqlExecutionContext.create(context);
    const token = ctx.getContext().token;

    if (ctx.token) {
      this.httpService.axiosRef.defaults.headers.common['authorization'] =
        token;
    }
    return next.handle().pipe();
  }
}

Zaregistrujte interceptor v hlavním modulu jako globální

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: HttpServiceInterceptor,
    },
  ],
})
export class AppModule {}

Pokud použiji výše uvedené řešení, můžeme garantovat, že token někoho jiného nebude použit v jiných požadavcích, protože tyto společné hlavičky jsou dostupné pro všechna místa, kde používáme httpService? Nebo se mýlím?