2

我的 WebSocket 中有一个UseGuard。实际上,这个守卫是一个JwtAuthGuard延伸的AuthGuard('jwt')JwtAuthGuard有一个名为 Strategy 的类JwtStrategy。在这堂课中,我有一个validate方法。在基于 HTTP 的请求中,我在此方法中返回有效负载。然后 nestjs 将有效负载附加到req. 这是我的策略课:

@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,以便将有效负载附加到 WebSocket 的主体(或我可以访问有效负载的任何东西)。任何的想法?

4

1 回答 1

2

您无需对策略类进行任何修改。相反,你应该修改你JwtAuthGuardgetRequest方法(如果你没有,那么你应该做一个),它返回一个对象,headers该对象的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/elseorswitch语句并根据contextTypefrom返回正确的对象来跨不同的上下文类型进行此操作context.getType()。此getRequest方法返回的任何内容都是护照最终附加属性的位置,因此返回具有这些额外值user的整个客户端可能是有意义的。

于 2021-07-12T19:50:44.810 回答