如何解决Nestjs JwtStrategy 访问上下文
我的 WebSocket 中有一个 UseGuard
。实际上,这个守卫是一个扩展 JwtAuthGuard
的 AuthGuard('jwt')
。 JwtAuthGuard
有一个名为 JwtStrategy
的策略类。在这个类中,我有一个 validate
方法。在基于 HTTP 的请求中,我以这种方法返回 payload。然后 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
方法中访问 context,以便将有效负载附加到 WebSocket 的主体(或我可以访问有效负载的任何内容)。有什么想法吗?
解决方法
您无需对策略类进行任何修改。相反,您应该修改 JwtAuthGuard
的 getRequest
方法(如果您没有,那么您应该创建一个),该方法返回一个具有 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/else
或 switch
语句并根据 contextType
中的 context.getType()
返回正确的对象,从而使这项工作在不同的上下文类型中起作用。无论从这个 getRequest
方法返回什么,passport 最终都会附加 user
属性,因此使用这些额外值返回整个客户端可能是有意义的。 >
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。