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

Допустим, у нас есть базовое приложение Блоги, в котором User hasMany Posts, а каждый Post, в свою очередь, hasMany Comments.

Ниже приводится суть, содержащая базовую схему GraphQL этого приложения.

Постановка задачи

Допустим, мы хотим, чтобы только зарегистрированные пользователи с ролью USER имели доступ к комментариям. Как мы можем это реализовать?

Подход 1 - Использование директивы схемы

Авторизация для запросов, мутаций и типов может быть реализована с помощью директив схемы. Фактически, этот раздел документации Apollo дает нам пример реализации авторизации с помощью директив.

Давайте реализуем директиву auth таким же образом, как описано в документации Apollo.

Обратите внимание, что в приведенном выше коде проверено наличие requiredRole. requiredRole должен передаваться как параметр везде, где мы используем директиву auth.

Кроме того, ведется регистрация isUser текста, чтобы мы точно знали, сколько раз эта функция выполняется.

Изменения в baseTypeDefs.js будут следующими:

Обратите внимание на использование директивы @auth для CommentType. Полный рабочий пример вы можете найти в этом репозитории.

Вот скриншот журнала сервера при выполнении users запроса.

Как видите, директива @auth выполняется один раз для каждой CommentType записи.

Это повторное выполнение вообще необходимо? Как это можно оптимизировать?

Подход 2: graphql-shield - лучшая альтернатива

Создание правил авторизации очень интуитивно понятно с GraphQL Shield.

В приведенном ниже коде я создал isUser разрешение для CommentType

В правиле isUser обратите внимание на использование contextual cache, которое гарантирует, что результат этого правила кэшируется для этого конкретного контекста, и таким образом предотвращает ненужную загрузку данных.

Для полной реализации вы можете обратиться к этому репозиторию.

Выполнив тот же запрос, вы увидите, что isUser выполняется только один раз.

Вот несколько ресурсов, чтобы узнать больше по этой теме.
1. Обсуждение GraphQL Summit 2020 - Как авторизоваться
2. Официальный блог Apollo