Websocket 适配器中的 NestJS 依赖注入
NestJS Dependency Injection in Websocket Adapter
我正在尝试在 NestJS 应用程序中建立 websocket 连接时验证和检查用户的权限。
我找到了 this discussion which recommends to make use of NestJS Websocket adapter。您可以在 options.allowRequest
回调中执行令牌验证,如下所示。
export class AuthenticatedSocketIoAdapter extends IoAdapter {
private readonly authService: AuthService;
constructor(private app: INestApplicationContext) {
super(app);
this.authService = app.get(AuthService);
}
createIOServer(port: number, options?: SocketIO.ServerOptions): any {
options.allowRequest = async (request, allowFunction) => {
const token = request.headers.authorization.replace('Bearer ', '');
const verified = this.authService.verifyToken(token);
if (verified) {
return allowFunction(null, true);
}
return allowFunction('Unauthorized', false);
};
return super.createIOServer(port, options);
}
}
但是我在 websocket 适配器中的依赖项注入有问题。 IoAdapter
的构造函数有一个 INestApplicationContext
参数,我试图从中使用 app.get(AuthService)
取回 AuthService
,如上所示。
AuthService 注入了另外两个服务,UserService
和 JwtService
来检查 JWT 令牌。我的问题是那些服务在那个上下文中仍然没有定义。
@Injectable()
export class AuthService {
constructor(private usersService: UsersService, private jwtService: JwtService) {}
verifyToken(token: string): boolean {
// Problem: this.jwtService is undefined
const user = this.jwtService.verify(token, { publicKey });
// ... check user has permissions and return result
}
有关信息,AuthService
在定义 Websocket 的模块之外的另一个模块中。我还尝试在当前模块中导入 AuthService(及其依赖项),但这没有帮助。
是否可以使用 app.get()
方法使用该服务?
我可以使用 app.resolve()
而不是 app.get()
来解决 DI 问题
export class AuthenticatedSocketIoAdapter extends IoAdapter {
private authService: AuthService;
constructor(private app: INestApplicationContext) {
super(app);
app.resolve<AuthService>(AuthService).then((authService) => {
this.authService = authService;
});
}
}
这解决了未定义 AuthService
中注入的 jwtService
。
我正在尝试在 NestJS 应用程序中建立 websocket 连接时验证和检查用户的权限。
我找到了 this discussion which recommends to make use of NestJS Websocket adapter。您可以在 options.allowRequest
回调中执行令牌验证,如下所示。
export class AuthenticatedSocketIoAdapter extends IoAdapter {
private readonly authService: AuthService;
constructor(private app: INestApplicationContext) {
super(app);
this.authService = app.get(AuthService);
}
createIOServer(port: number, options?: SocketIO.ServerOptions): any {
options.allowRequest = async (request, allowFunction) => {
const token = request.headers.authorization.replace('Bearer ', '');
const verified = this.authService.verifyToken(token);
if (verified) {
return allowFunction(null, true);
}
return allowFunction('Unauthorized', false);
};
return super.createIOServer(port, options);
}
}
但是我在 websocket 适配器中的依赖项注入有问题。 IoAdapter
的构造函数有一个 INestApplicationContext
参数,我试图从中使用 app.get(AuthService)
取回 AuthService
,如上所示。
AuthService 注入了另外两个服务,UserService
和 JwtService
来检查 JWT 令牌。我的问题是那些服务在那个上下文中仍然没有定义。
@Injectable()
export class AuthService {
constructor(private usersService: UsersService, private jwtService: JwtService) {}
verifyToken(token: string): boolean {
// Problem: this.jwtService is undefined
const user = this.jwtService.verify(token, { publicKey });
// ... check user has permissions and return result
}
有关信息,AuthService
在定义 Websocket 的模块之外的另一个模块中。我还尝试在当前模块中导入 AuthService(及其依赖项),但这没有帮助。
是否可以使用 app.get()
方法使用该服务?
我可以使用 app.resolve()
而不是 app.get()
export class AuthenticatedSocketIoAdapter extends IoAdapter {
private authService: AuthService;
constructor(private app: INestApplicationContext) {
super(app);
app.resolve<AuthService>(AuthService).then((authService) => {
this.authService = authService;
});
}
}
这解决了未定义 AuthService
中注入的 jwtService
。