Русский
  • hasura
  • restful api
  • graphql
  • logto
  • custom jwt
  • управление доступом
  • авторизация

Logto x Hasura: использование JWT для управления доступом

Это подробное руководство описывает шаги, связанные с интеграцией Logto с управлением доступом Hasura в режиме JWT, что эффективно усиливает безопасность данных.

Darcy Ye
Darcy Ye
Developer

Hasura — это инструмент, который может быстро предоставить соответствующие GraphQL и REST API под ваши данные. Учитывая безопасность данных, Hasura также предоставляет возможность детальной настройки управления доступом для каждого отдельного API.

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

В этом посте в блоге мы предположим, что вы уже используете службы Hasura. Мы расскажем, как интегрировать Hasura и Logto, чтобы максимально обезопасить ваши данные. Если у вас нет учетной записи Logto, зарегистрируйтесь и начните использовать её сейчас!

Предыстория

Hasura использует управление доступом на основе ролей, в то время как Logto применяет стандартное управление доступом на основе ролей (RBAC).

В модели и лучшей практике RBAC от Logto мы советуем пользователям использовать scope для определения наивысшей степени детализации разрешений, использовать role как набор scope для удобного выполнения пакетных операций и, в конечном итоге, проверять scope (обычно на стороне поставщиков ресурсов), чтобы убедиться, может ли пользователь выполнить определенную операцию.

В Hasura role соответствует наивысшей степени детализации разрешений, а проверки разрешений выполняются на основе role. Поэтому при настройке Logto мы рекомендуем сопоставить одну role с одним scope. Этот подход может связать разрешения Logto и Hasura, чтобы избежать путаницы и неправильного использования.

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

Начнем

Давайте начнем с простого примера. Допустим, у пользователя уже есть два API в Hasura — GET /user и PATCH /user, соответствующие двум ролям: user:reader и user:maintainer соответственно.

1. Создайте ресурс API Hasura в Logto

Создайте ресурс API Hasura в Logto.

Hasura API

2. Создайте роли в соответствии с настройкой Hasura в Logto

Нам нужно создать два scope для ресурса API Hasura, упомянутого в шаге 1, а именно: read:user и maintain:user, а затем создать две роли: user:reader (содержащую scope read:user) и user:maintainer (включающую scope maintain:user), которые будут соответствовать ролям Hasura один к одному. Затем назначьте эти роли пользователям Logto по мере необходимости.

Hasura API со scope

Роль читателя пользователей

Роль maintainer пользователей

3. Настройте переменную окружения Hasura HASURA_GRAPHQL_JWT_SECRET для включения режима JWT

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

Есть множество различных опций, которые можно настроить, но здесь мы представляем самый простой случай: нужно сконфигурировать только jwk_url. Это значение можно получить с вашего Logto по endpoint'у конфигурации OpenID (https://your.logto.domain/oidc/.well-known/openid-configuration).

Настройка JWT Hasura

4. Настройте дополнительные claims access-токена пользователя

Используя функцию Custom JWT Logto, настройте логику для добавления дополнительных claims в access-токен пользователя в формате JWT.

Скрипт access-токена пользователя

Настройте метод getCustomJwtClaims, чтобы добавить данные в JWT, на которые полагается Hasura для реализации управления доступом. Это могут быть данные, относящиеся к пользователю, который авторизуется в данный момент, включая role, которые можно получить через context.

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

5. Интегрируйте SDK Logto

После настройки Logto и Hasura интегрируйте свое приложение с SDK Logto. Здесь мы используем пример Next для предварительного просмотра access-токена пользователя, выданного Logto после входа пользователя.

Пользователь с ролями

Сначала назначаем пользователю ранее созданные роли user:reader и user:maintainer, а затем входим в систему под этим пользователем.

Получите access-токен пользователя и запросите API Hasura:

Заключение

В этой статье мы предлагаем еще один метод управления доступом на основе JWT, поддерживаемый Hasura, помимо Webhook.

Сравнив процессы Webhook и JWT управления доступом в Hasura, можно увидеть, что в подходе Webhook на каждый запрос Hasura отправляется Webhook в Logto и ожидается ответ; в то время как метод на основе JWT может использоваться непрерывно до истечения срока действия JWT.

Метод JWT может уменьшить сетевую нагрузку и устранить задержку в сети, вызванную Webhook'ами; в то время как подход Webhook позволяет синхронизировать изменения в разрешениях пользователей в реальном времени.

Пользователи могут выбрать подходящий вариант на основе этих выводов, в сочетании с их реальными бизнес-потребностями.