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