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?