Контекст ApolloServer 2.0 и общедоступные / частные части GraphQL API

Я ни в коем случае не профессионал, но я запустил бэкэнд ApolloServer / Express для размещения сайта, на котором у меня будут публичные части и частные части для участников. Я генерирую токен JWT в мутации входа в систему и получаю его клиенту.

В контексте я хочу проверить, установлен ли токен или нет, и на основе этого дескриптора, какие запросы GraphQL разрешены. Мой сервер Express / Apollo сейчас выглядит так.

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: async ({ req }) => {
    // get the user token from the headers
    const token = (await req.headers.authorization) || '';

    if (token) {
      member = await getMember(token);
    }
  }
});

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

Может ли кто-нибудь пролить свет на это, чтобы помочь мне понять, что мне нужно сделать, чтобы это работало.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
719
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

способ, которым я это делаю, заключается в том, что я создам промежуточное ПО для аутентификации еще до сервера graphql, поскольку иногда требуется иметь информацию об аутентифицированном пользователе также в других промежуточных программах, а не только в схеме GraphQL. Добавлю несколько кодов, которые вам нужны для этого

const auth = (req, res, next) => {
  if (typeof req.headers.authorization !== 'string') {
    return next();
  }

  const header = req.headers.authorization;
  const token = header.replace('Bearer ', '');
  try {
    const jwtData = jwt.verify(token, JWT_SECRET);
    if (jwtData && jwtData.user) {
      req.user = jwtData.user;
    } else {
      console.info('Token was not authorized');
    }
  } catch (err) {
    console.info('Invalid token');
  }
  return next();
};

Таким образом, я вводю пользователя в каждый запрос, если установлен правильный токен. Тогда в apollo server 2 вы можете сделать это следующим образом.

const initGraphQLserver = () => {
  const graphQLConfig = {
    context: ({ req, res }) => ({
      user: req.user,
    }),
    rootValue: {},
    schema,
  };

  const apolloServer = new ApolloServer(graphQLConfig);
  return apolloServer;
};

Эта функция запустит ApolloServer, и вы примените это промежуточное ПО в нужном месте. Перед применением на сервере apollo 2 нам необходимо иметь промежуточное ПО для аутентификации.

app.use(auth);

initGraphQLserver().applyMiddleware({ app });

предполагая, что приложение

const app = express();

Теперь у вас будет пользователь из пользователя jwtData, введенный в контекст для каждого преобразователя как «пользователь» или в req.user в других промежуточных программах, и вы можете использовать его, например, вот так. Это мой запрос, чтобы сказать, какой пользователь аутентифицирован или нет

  me: {
    type: User,
    resolve: async (source, args, ctx) => {
      const id = get(ctx, 'user.id');

      if (!id) return null;

      const oneUser = await getOneUser({}, { id, isActive: true });
      return oneUser;
    },
  },

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

Лучший Дэвид

Спасибо, что нашли время. Я просто взглянул на код в данный момент, потому что я сейчас на работе, но сегодня сяду и попробую это :) Думаю, я понимаю большую часть этого :) Вернусь с результатом.

Roger Nordqvist 23.08.2018 13:18

Я попробовал, но много ли в этом контексте ApolloServer мне не нужно? Не уверен, откуда берется каждый параметр контекста. Я понимаю, что промежуточное программное обеспечение auth для express и что оно должно выполняться до промежуточного программного обеспечения приложения.

Roger Nordqvist 23.08.2018 15:38

Привет, парень, извините за путаницу, я скопировал это из своего проекта, поэтому есть довольно много дополнительных вещей. Я удалил его, так что, надеюсь, теперь он более понятен. Обратите внимание, что в моем проекте я использовал схему, определенную с помощью подхода на основе классов из библиотеки graphql-js, а не инструментов graphql, поэтому у вас есть typeDefs, преобразователи и т.д., а не схема в конструкторе сервера apollo.

David Mraz 23.08.2018 17:20

Спасибо за информацию. Думаю, теперь я это понимаю :)

Roger Nordqvist 25.08.2018 12:08

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