Модуль GraphQL - запускать промежуточное ПО для всех операций, кроме общедоступных.

Я начал работать с модулями GraphQL , и они представляют концепцию промежуточного программного обеспечения, в котором вы можете применять на разных уровнях.

Я настроил промежуточное ПО для всего своего приложения, как это, чтобы требовать аутентификации:

      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();
}

Однако есть несколько запросов и изменений, которые я бы хотел обойти, потому что они общедоступны. Я думал, что добавление их на уровне модуля переопределит промежуточное ПО приложения:

      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индивидуально для операций, но это не очень масштабируемо, поскольку для большинства операций требуется auth. Другая идея - создать отдельные модули для общедоступных / защищенных операций, но я не уверен, каково влияние на производительность, поскольку оба полагаются на одни и те же типы.

0 ответов

Другие вопросы по тегам