Защитите свои запросы и изменения в Apollo Server v2
Я всегда хотел попробовать GraphQL, и в Интернете есть масса ресурсов о том, как начать работу, но я не мог найти ни одного, который лучше всего объяснял бы, как обрабатывать аутентификацию и авторизацию, некоторые включали другие модули и пакеты, которые я не делал '' не вижу необходимости в моей настройке, поэтому я подумал о том, чтобы поделиться своей настройкой.
Начнем с определения GraphQL
Хотя я не буду углубляться в объяснение GraphQL или сравнение GraphQL с REST, я хотел бы, чтобы вы имели базовое представление о том, что это такое и как он делает то, что делает.
GraphQL - это язык запросов для API и среда выполнения для выполнения этих запросов с вашими существующими данными. GraphQL предоставляет полное и понятное описание данных в вашем API, дает клиентам возможность запрашивать именно то, что им нужно, и не более того, упрощает развитие API с течением времени и предоставляет мощные инструменты разработчика. Официальный веб-сайт GraphQL
GraphQL приобрел большую популярность и используется крупными компаниями, такими как Facebook, Github, Pinterest, Shopify и другими.
С помощью GraphQL вы описываете данные своего приложения, указываете ему, какие именно данные вам нужны, и получаете ответ только в виде запрошенных данных. Это помогает избежать получения дополнительных данных, которые вам нужны. Простой пример выглядит следующим образом:


Я расширил приведенный выше снимок экрана специально, чтобы показать вам, что игровая площадка GraphQL документирует схему от вашего имени, и вы можете расширить ее, а также имеет отличное автозаполнение, которое поможет вам при вводе.
Поговорим об основных основах GraphQL
Запрос
запрос в GraphQL - это то, как вы запрашиваете и извлекаете данные, считайте, что вы отправляете запрос, в котором говорится: «Привет, дайте мне данные в этом формате», запросы являются основой GraphQL, и именно поэтому он не называется языком запросов.
Мутация
Мутации также являются запросами, но они идут дальше, манипулируя данными, проходящими через них. Мутации - это функции, которые изменяют данные в хранилище данных и возвращают значение, мы рассмотрим некоторые примеры позже.
Схема
Схема представляет данные, она описывает полноту всех полей конкретной сущности, которые могут быть запрошены от любого клиента. Следует отметить, что клиенту не нужно запрашивать все поля, указанные в схеме, при запросе вы только указываете, какие данные вам нужны, а GraphQL выяснит все остальное.
Если вы хотите узнать больше по этой теме, проверьте эту ссылку, есть потрясающее руководство, которое охватывает GraphQL с клиента и сервера.
Хватит разговоров, займемся аутентификацией 😀
Мы будем использовать Apollo Server для быстрой настройки и множество хороших инструментов, которые Apollo предоставляет из коробки.
Что следует иметь в виду при проверке подлинности приложений, мы будем предполагать систему входа на основе пароля.
- Регистрация пользователя (электронная почта или пароль)
- Проверка ввода
- Авторизация
- Хеширование паролей
- Генерация и проверка токена
Примечание. GraphQL не выполняет ничего из вышеперечисленного от вашего имени. Имейте в виду, что это всего лишь язык запросов, поэтому нам нужно указать, какие запросы защищены и как защитить эти запросы.
Инструменты, которые мы собираемся использовать
- Jsonwebtoken (для генерации синхронизированного токена для каждого пользователя)
- Bcrypt (для хеширования паролей)
Начнем с определения схемы пользователя

В приведенном выше фрагменте мы написали определения типов для пользователя, у нас есть 3 основных элемента: Запрос - это основной или корневой запрос, все остальное возвращается по этому запросу. это определяет, какие данные должны быть возвращены, когда мы запрашиваем пользователя. Мутации, как мы объясняли выше, , относятся к любому побочному эффекту, происходящему с GraphQL, это очень важно, потому что теперь мы знаем, какие данные будет содержать наш пользователь.
Давайте напишем преобразователи, чтобы наши мутации работали должным образом
преобразователи - это в основном функции, которые действуют с нашими данными и что-то делают, а затем возвращают значение, преобразователи должны соответствовать схеме, иначе GraphQL выдаст вам ошибку.

Теперь пришло время использовать упомянутые выше пакеты, давайте начнем с регистрации пользователя и хэширования пароля, это очень хорошая практика, чтобы не хранить пароль в виде простого текста, мы будем шифровать пароль для хеширования, а затем сравним хешированное значение и заданный пароль перед тем, как мы войдем в систему.
Давайте модифицируем наши преобразователи так, чтобы они хешировали пароль и сгенерировали токен.
Таким образом, это в основном то, что вам нужно для выполнения базовой аутентификации, но контекст, который вы видели выше, и токен должны где-то использоваться, это то, что мы собираемся сделать.
Мы должны сообщить Apollo Server, что мы передаем токен и секрет в контексте, код ниже слишком длинный, поэтому позвольте мне сначала разбить его, чтобы резюмировать все.
TL; DR;
- Создать модель пользователя
- Подключиться к базе данных
- Зарегистрируйте пользователя через регистровую мутацию с хешированным паролем
- Войдите в систему и сгенерируйте токен в мутации входа в систему
- Передайте контекст и пользователя контексту (чтобы позже получить к ним доступ в распознавателях)
- Защитите все другие запросы и изменения в зависимости от действительности токена.
Код не такой чистый, и он содержится в одном файле 🤨, это только для демонстрации и для того, чтобы показать вам, как вы можете выполнять базовую аутентификацию и авторизацию.
Живая демонстрация
Чтобы использовать демонстрацию, вам необходимо настроить заголовок как аутентификацию, вы также можете подключиться к этому серверу с любого клиента GraphQL.
Вот различные запросы, которые вы можете запустить в кодовом окне выше, и их ответы.


Если вы попытаетесь запросить пользователей, вы получите ошибку аутентификации, которую можно настроить, потому что заголовок аутентификации содержит пустую строку вместо фактического токена, который мы получили выше при входе в систему.

Ниже мы предоставляем заголовок с правильным токеном, и вы можете видеть, что мы получаем электронные письма наших пользователей в виде запроса в запросе.

Статья длиннее, чем предполагалось, я просто хотел убедиться, что охватил большую часть того, что необходимо для защиты запросов и мутаций в GraphQL, и я надеюсь, что это помогло.
Заключение
GraphQL - не новый инструмент, он уже был протестирован и опробован, и крупные компании используют его, и все больше людей переходят на него. Возможно, сейчас самое время попробовать.
Исходный код можно найти здесь, на Github.
Я сосредоточусь на других технологиях, отличных от того, что я делал в рамках моей новой работы, и мне не терпится поделиться тем, что я буду изучать.
Не стесняйтесь обращаться, если вам нужна помощь по всему, о чем я уже писал.
Спасибо, что нашли время прочитать.