Этот блог также предполагает, что вы знакомы с директивами схемы 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