F.31. Базовый валидатор токенов OAuth#

F.31. Базовый валидатор токенов OAuth

F.31. Базовый валидатор токенов OAuth #

Этот модуль реализует простой валидатор токенов OAuth 2.0 для встроенной поддержки PostgreSQL потока авторизации устройства. Валидатор выполняет минимальную проверку, путем:

  • Извлечение полей sub (subject) и scope из полезной нагрузки JWT.

  • Сравнение областей действия токена с теми, которые требуются записью pg_hba.conf.

  • Сопоставление аутентифицированной идентичности sub с ролью базы данных с использованием pg_ident.conf.

  • Разрешение или запрет доступа на основе совпадения sub и scope.

F.31.1. Логика проверки токена #

Он выполняет следующие шаги:

  1. Разбор полезной нагрузки токена: Исходная строка токена разбирается для извлечения ее полезной нагрузки. Если токен имеет неверный формат или полезная нагрузка не может быть извлечена, проверка завершается неудачей.

  2. Извлечение утверждений JWT: Полезная нагрузка должна содержать оба:

    • sub: Субъект (используется для идентификации пользователя)

    • scope: Разделенный пробелами список областей, предоставленных токеном

    Если любое из полей отсутствует, проверка завершается неудачей.

  3. Сравните области: Области из записи oauth_scope в pg_hba.conf сравниваются с областями, предоставленными токеном. Если некоторые отсутствуют в токене, проверка не проходит.

    В приведенном выше примере конфигурации проверка будет успешной, если токен содержит оба скоупа: openid и postgres.

  4. Установить результат авторизации: Флаг res->authorized устанавливается в true, если области совпадают; в противном случае он устанавливается в false.

  5. Назначить идентификацию аутентификации: Значение sub присваивается res->authn_id, которое PostgreSQL использует для идентификации аутентифицированного пользователя.

  6. Карта аутентификационной идентичности: Это значение sub затем сопоставляется вне этого модуля с записями в pg_ident.conf для определения фактической роли базы данных, которую пользователь имеет право принять.

    Если сопоставление не удается, проверка не проходит.

  7. В противном случае проверка проходит успешно, и клиент авторизован и успешно подключен к базе данных.

F.31.2. Пример конфигурации #

Пример записи в pg_hba.conf:

# TYPE  DATABASE  USER  ADDRESS     METHOD  [OPTIONS]
local    all    all    oauth issuer="https://<address>/.well-known/openid-configuration" scope="openid postgres" map="oauthmap"
    

Пример записи в pg_ident.conf:

# MAPNAME       SYSTEM-USERNAME    PG-USERNAME
oauthmap    "7cf5b11f-adb2-4e67-83b7-5c75f7f1e6ee"    mydbuser
    

Если токен содержит sub: "7cf5b11f-adb2-4e67-83b7-5c75f7f1e6ee", и проверка проходит, PostgreSQL сопоставит "7cf5b11f-adb2-4e67-83b7-5c75f7f1e6ee" с ролью mydbuser с использованием записи oauthmap.

F.31.3. Требования #

  • Модуль валидатора должен быть загружен через oauth_validator_libraries.

  • pg_hba.conf должен указывать oauth в качестве метода аутентификации и определять oauth_scope.

  • pg_ident.conf должен содержать отображения из значений sub в роли PostgreSQL.