处理 GraphQL 和 REST 的 NestJS AuthGuard

Posted

技术标签:

【中文标题】处理 GraphQL 和 REST 的 NestJS AuthGuard【英文标题】:NestJS AuthGuard that handles both GraphQL and REST 【发布时间】:2021-06-27 06:49:37 【问题描述】:

根据文档,为了将 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(这次我没有覆盖它)和调用canActivate后从请求中提取user对象的方法之外,其代码完全相同。

GraphQL:

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

休息:

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

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

【问题讨论】:

【参考方案1】:

getRequest 方法为什么没有这样的东西:

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

现在你只需要一个守卫。无论使用 GraphQL 还是 REST,req.user 的填充方式都相同

【讨论】:

这太棒了!但是我怎样才能对此进行单元测试呢?我似乎无法将'getType'的返回值模拟为'graphql'类型'string'不可分配给'TContext'类型。

以上是关于处理 GraphQL 和 REST 的 NestJS AuthGuard的主要内容,如果未能解决你的问题,请参考以下文章

用 GraphQL 替换 REST 调用

REST 2.0 来了,它的新名字叫GRAPHQL

REST将会过时,而GraphQL则会长存

streamsets rest api 转换 graphql

使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API

sofa graphql 2 rest api webhook 试用