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。相反,您应该修改 JwtAuthGuardgetRequest 方法(如果您没有,那么您应该创建一个),使 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/elseswitch 语句并根据 contextTypecontext.getType()。无论从这个 getRequest 方法中 return 编辑什么,护照最终都会附加 user 属性,因此它可能对 return 整个客户端 这些额外的值。