1

我开始使用GraphQL Modules,它们引入了中间件的概念,您可以在其中应用不同的级别。

我为我的整个应用程序配置了一个中间件,像这样要求身份验证:

export const modularApp = createApplication({
    modules: [customerModule, premiumModule],
    middlewares: {
        "*": {
            "*": [authMiddleware],
        },
    },
});

export function authMiddleware({ root, args, context, info }, next) {
  if (context.authenticated) {
    throw new AuthenticationError("Unauthorized");
  }
  return next();
}

但是,我想绕过一些查询和突变authMiddleware,因为它们是公开的。我认为在模块级别添加它们会覆盖应用程序中间件:

export default createModule({
  id: 'customer-module',
  dirname: __dirname,
  typeDefs,
  resolvers,
  middlewares: {
    'Query': {
      'somePublicOperation': [publicMiddleware],
    }
  },
});

export function publicMiddleware({ root, args, context, info }, next) {
  // bypass authMiddleware
  return next();
}

两个中间件都被执行了,所以我想不出这个问题的解决方案。

我可以将authMiddleware单独添加到操作中,但这不是非常可扩展的,因为大多数操作都需要身份验证。另一个想法是为公共/受保护的操作创建单独的模块,但我不确定性能影响是什么,因为两者都依赖于相同的类型。

4

0 回答 0