处理 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的主要内容,如果未能解决你的问题,请参考以下文章
streamsets rest api 转换 graphql