Как получить мгновенные API GraphQL в существующей программе Laravel

1656552020 kak poluchit mgnovennye api graphql v sushhestvuyushhej programme laravel

от Karthikeya Viswanath

1*q3KiCaC7_bynx8CfVlTXNw
Фото Фабиана Гроса на Unsplash

TL; DR

В этой публикации мы будем использовать механизм Hasura GraphQL Engine, чтобы получить мгновенные API GraphQL в моей существующей программе Laravel, работающей локально.

Для целей этого проекта мы будем использовать образец программы Laravel ToDo, созданной с помощью Laravel 5.1, и модифицировать код для интеграции HGE. (Заметьте, что Laravel 5.1 уже закончился в июне 2018 года, и вам следует перейти к более новой версии, если вы все еще используете это.)

Вы можете найти начальный образец программы здесь, окончательное хранилище здесь, а живое приложение для тестирования здесь.

Вот как будет выглядеть наша запланированная архитектура:

1*hEit6SqjtIbh0gdYFE0cGw
Архитектура до и после интеграции с HGE

Настройка GraphQL Engine

Механизм Hasura GraphQL (HGE) дает вам мгновенный API GraphQL в реальном времени поверх вашего существующего Postgres. HGE работает «из коробки» с имеющимися:

  • База данных Postgres Подключается к существующей базе данных и предоставляет API GraphQL для вашей базы данных.
  • Система аутентификации Подключается к существующей системе аутентификации для защиты GraphQL API.
  • Миграционная система Hasura GraphQL Engine не мешает существующей системе миграции Laravel. Схемами можно управлять раздельно в Laravel, если это не изменяет схему, отслеживаемую GraphQL Engine. Подробнее о том, как механизм Hasura GraphQL управляет состоянием вашей схемы здесь.

Также он поставляется с превосходной консолью с интегрированным GraphiQL, которая полезна при отладке API GraphQL.

Установка

Двигатель Hasura GraphQL можно установить на Heroku с помощью кнопки ниже

1*dcgu-klnpwTWilYiGMdM6Q
Нажмите эту кнопку, чтобы развернуть механизм GraphQL на Heroku

или любой машине, на которой можно запустить Docker. Дополнительную информацию см. в разделе «Начало работы».

Ради этого учебника мы настроили экземпляр HGE для нашей программы Laravel здесь (используйте ключ доступа helloworld ниже мы объясним, как это работает).

Установка с помощью Docker

Перед установкой Hasura GraphQL Engine вам понадобится строка подключения Postgres. Вы можете получить это из своего config/database.php файл, или ваш .env файл, где бы ни хранились ваши учетные данные.

Соединение деталей:

postgres://username:SECUREPASSWORD@host:port/database_name

Следуйте инструкциям здесь.

После запуска механизма Hasura GraphQL открывается консоль Hasura. Консоль предоставляет экземпляр GraphiQL для легкого тестирования всех ваших запросов GraphQL, мутаций и т.д.

1*dJlxjx1PHK5flNXiKVy5sg
Консоль Hasura GraphQL Engine

Теперь перейдите на вкладку «Данные» и отслеживайте все таблицы, чтобы создать мгновенные API GraphQL!

Аутентификация

По умолчанию HGE устанавливается в режиме разработки. Все таблицы/видения, отслеживаемые HGE, можно просматривать/обновлять без каких-либо проверок. Это не рекомендуется для производственной среды. Hasura позволяет определить подробные средства контроля доступа для каждого поля в вашей схеме GraphQL, то есть для каждой таблицы или представления в вашей схеме Postgres. Эти правила контроля доступа могут использовать динамические переменные, поступающие по каждому запросу. Дополнительные сведения см. в документах.

HGE можно защитить от прямого доступа, настроив URL вебхука, который будет вызываться для проверки каждого запроса, если запрос не содержит действительный access-key.

Давайте сначала сделаем простой запрос для пользователей:

И запустить его в GraphiQL:

1*VVG55IL6bFoDlYnCDvk9vg

Заметьте, что x-hasura-user-id установлено на «2» и x-hasura-role установлено на «пользователь». Это такие auth заголовки, которые нужно установить с помощью auth-hook в производственном режиме (Двигатель GraphQL начался с access-key и auth-hook).

Защищенный API GraphQL

1*nJKLzkgQXGd7a7ILDBAEfQ
Архитектура Webhook

Первым шагом является защита HGE с помощью anaccess-key и настроить auth-hook с помощью веб-хука, который в этом случае будет обслуживаться программой Laravel. Этот веб-хук будет вызван механизмом GraphQL с заголовками, добавленными к запросу. Вебхук вернет соответствующее значение x-hasura-role и x-hasura-user-id который он может получить, аутентифицируя пользователя с помощью Authorization заголовок, передаваемый по запросу.

Здесь хостом аутентификации будет ваш IP-адрес в сети docker bridge, если вы используете docker, или URL-адрес веб-хука в противном случае. Вы можете игнорировать postgres раздел, если вы используете внешнюю базу данных Postgres.

Чтобы настроить access-key / auth-hook флаги на вашем экземпляре Heroku HGE, следуйте этим инструкциям. Мы будем считать, что вебхук находится в /hge-webhook сейчас мы настроим его на Laravel позже.

Давайте попробуем сделать запрос еще раз и посмотрим, какой ответ.

1*afYqLtDIyrJyR7RU7iG6_w

Это потому, что мы еще не настроили вебхук или даже не настроили правильный Authorization заголовки.

Настройка вебхука Laravel

Давайте настроим наш образец программы Heroku, чтобы мы могли легко развернуть его и проверить наши изменения.

Для целей учебника мы развернули образец программы с вебхуком. Подходящий экземпляр HGE можно получить здесь. (Ключ доступа: helloworld )

Вы можете зарегистрироваться в этом примере программы и добавить/удалить задачи в программе.

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

php artisan make:middleware webhookMiddleware

Давайте сначала добавим маршрут к нашему app/Http/routes.php файл:

Теперь мы зарегистрируем наше промежуточное программное обеспечение, добавив его в файл app/Http/Kernel.php файл под routeMiddleware:

Теперь давайте настроим фактический вебхук на app/Http/Middleware/webhookMiddleware.php :

Эта страница просто использует Authorization маркер носителя для начала сеанса, а затем использует Laravel Auth для проверки и получения идентификатора пользователя. Вы можете изменить это, чтобы добавить свою логику сеанса/токена и проверить аутентификацию.

Если подтверждено, мы возвращаем x-hasura-role и x-hasura-user-id переменные как JSON. Это позволит аутентифицировать запрос к HGE.

Теперь нам нужен простой способ получить маркер сеанса пользователя, который вошел в систему, и давайте добавим это к нашему. resources/views/users/profile.blade.php :

Теперь войдите и перейдите в профиль пользователя, чтобы увидеть свой новый маркер сеанса:

1*KvPgJCAvDSq3btHtZ-xw7A

Давайте закрепим и развернем это на Heroku:

git commit -am "Add HGE webhook"

git push heroku master

Когда он будет нажат, давайте перейдем в HGE Console, чтобы протестировать наш новый вебхук!

1*2hIa4anl3efGIqbJv2dgLw
Авторизация с помощью токена предъявителя

Вебхук возвращает соответствующее x-hasura-user-id и x-hasura-roleа механизм GraphQL соответствует соответствующим результатам, как настроены в правилах доступа.

Миграционная система

HGE поставляется с мощной системой миграции на основе Rails, а изменения, внесенные на консоли HGE, автоматически создают файлы схемы в вашей папке при запуске как hasura console (для этого можно установить Hasura CLI).

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

Для получения более подробной инструкции можно просмотреть документацию HGE.

После того, как вы настроите все, как описано по ссылке выше, вы можете просто добавить папку, созданную в ваше хранилище контроля версий для кода Laravel.

Чтобы экспортировать метаданные, выполните следующую команду в папке, созданной файлом hasura init команда в инструкциях по миграции:

hasura metadata export

Поскольку мы позволяем Laravel обрабатывать миграции, избегайте изменений в схеме через консоль Hasura, чтобы миграции Laravel оставались вашим источником правды по схеме.

Это! Теперь у нас есть безопасная конечная точка HGE, работающая с внутренней авторизацией Laravel. Идите и пишите код!

Хассура дает вам мгновенные API GraphQL в реальном времени через любую базу данных Postgres без необходимости писать любой бэкенд-код.

Добавить комментарий

Ваш адрес email не будет опубликован.