Logto x Hasura: использование JWT для управления доступом
Это подробное руководство описывает шаги, связанные с интеграцией Logto с управлением доступом Hasura в режиме JWT, что эффективно усиливает безопасность данных.
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.

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



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).

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

Настройте метод 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 позволяет синхронизировать изменения в разрешениях пользователей в реальном времени.
Пользователи могут выбрать подходящий вариант на основе этих выводов, в сочетании с их реальными бизнес-потребностями.

