Nestjs JwtStrategy 获取上下文
Nestjs JwtStrategy access to context
我的 WebSocket 中有一个 UseGuard
。实际上,这个守卫是 JwtAuthGuard
扩展 AuthGuard('jwt')
。 JwtAuthGuard
有一个名为 JwtStrategy
的策略 class。在这个 class 中,我有一个 validate
方法。在基于 HTTP 的请求中,我在这个方法中 return payload。然后 nestjs 将有效负载附加到 req
。这是我的策略 class:
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private authConfigService: AuthConfigService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: authConfigService.JWT_SECRET,
});
}
async validate(payload: any) {
return payload;
}
}
我想在 validate
方法中访问 context 以便将负载附加到 WebSocket 的主体(或任何我可以访问负载的东西) ).有什么想法吗?
您无需对您的策略进行任何修改class。相反,您应该修改 JwtAuthGuard
的 getRequest
方法(如果您没有,那么您应该创建一个),使 return 是一个具有 headers
的对象proeprty 是一个对象,authorization
属性 是一个字符串。像
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
getRequest(context: ExecutionContext) {
const ws = context.switchToWs().getClient(); // possibly `getData()` instead.
return {
headers: {
authorization: valueFromWs(ws),
}
}
}
}
您还可以通过使用 if/else
或 switch
语句并根据 contextType
从context.getType()
。无论从这个 getRequest
方法中 return 编辑什么,护照最终都会附加 user
属性,因此它可能对 return 整个客户端 和这些额外的值。
我的 WebSocket 中有一个 UseGuard
。实际上,这个守卫是 JwtAuthGuard
扩展 AuthGuard('jwt')
。 JwtAuthGuard
有一个名为 JwtStrategy
的策略 class。在这个 class 中,我有一个 validate
方法。在基于 HTTP 的请求中,我在这个方法中 return payload。然后 nestjs 将有效负载附加到 req
。这是我的策略 class:
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private authConfigService: AuthConfigService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: authConfigService.JWT_SECRET,
});
}
async validate(payload: any) {
return payload;
}
}
我想在 validate
方法中访问 context 以便将负载附加到 WebSocket 的主体(或任何我可以访问负载的东西) ).有什么想法吗?
您无需对您的策略进行任何修改class。相反,您应该修改 JwtAuthGuard
的 getRequest
方法(如果您没有,那么您应该创建一个),使 return 是一个具有 headers
的对象proeprty 是一个对象,authorization
属性 是一个字符串。像
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
getRequest(context: ExecutionContext) {
const ws = context.switchToWs().getClient(); // possibly `getData()` instead.
return {
headers: {
authorization: valueFromWs(ws),
}
}
}
}
您还可以通过使用 if/else
或 switch
语句并根据 contextType
从context.getType()
。无论从这个 getRequest
方法中 return 编辑什么,护照最终都会附加 user
属性,因此它可能对 return 整个客户端 和这些额外的值。