NestJS AuthGuard 可处理 GraphQL 和 REST

问题描述 投票:0回答:2

根据文档,为了使用 AuthGuard 进行 GraphQL 解析器的身份验证,我们必须重写

getRequest
方法,如下所示:

  getRequest(context: ExecutionContext) {
    const ctx = GqlExecutionContext.create(context);
    return ctx.getContext().req;
  }

我的大多数 API 使用 GraphQL,但其他 API 使用 REST 端点来处理文件上传。 (我提到了this)现在,我正在使用两个 AuthGuard。一种是针对 GraphQL,我像上面一样覆盖了

getRequest
。另一种是针对 REST 的,除了
getRequest
(这次我没有覆盖它)以及调用
user
后从请求中提取
canActivate
对象的方法之外,其代码完全相同。

GraphQL:

// getRequest is overridden
const user: User = this.getRequest(context).user;

休息:

// getRequest is NOT overridden
const { user } = context.switchToHttp().getRequest();

有什么方法可以尝试将这两个 AuthGuard 合二为一吗?

rest graphql nestjs auth-guard
2个回答
5
投票

为什么不为

getRequest
方法提供类似的东西:

getRequest(context: ExecutionContext) {
  if (context.getType<ContextType | 'graphql'>() === 'graphql') {
    return GqlExecutionContext.create(context).getContext().req;
  }
  return context.switchToHttp().getRequest();
}

现在你只需要一名守卫。无论使用 GraphQL 还是 REST,

req.user
都会以相同的方式填充


0
投票

NestJS 根据传入请求的类型提供不同类型的上下文。对于 HTTP 请求,上下文包括来自 Express 或 Fastify 的传统 Request 对象。但是,对于 GraphQL 请求,上下文封装在 GqlExecutionContext 中。

© www.soinside.com 2019 - 2024. All rights reserved.