49.3. Обратные вызовы валидатора OAuth#
49.3. Обратные вызовы валидатора OAuth #
Модули валидатора OAuth реализуют свою функциональность, определяя набор обратных вызовов. Сервер будет вызывать их по мере необходимости для обработки запроса аутентификации от пользователя.
49.3.1. Запуск обратного вызова #
startup_cb
обратный вызов выполняется непосредственно после
загрузки модуля. Этот обратный вызов можно использовать для настройки локального состояния и
выполнения дополнительной инициализации, если это необходимо. Если модуль валидатора
имеет состояние, он может использовать state->private_data
для
его хранения.
typedef void (*ValidatorStartupCB) (ValidatorModuleState *state);
49.3.2. Проверить Callback #
validate_cb
обратный вызов выполняется во время обмена OAuth, когда пользователь пытается аутентифицироваться с использованием OAuth. Любое состояние, установленное в предыдущих вызовах, будет доступно в state->private_data
.
typedef bool (*ValidatorValidateCB) (const ValidatorModuleState *state, const char *token, const char *role, ValidatorModuleResult *result);
token
будет содержать маркер-носитель для проверки.
PostgreSQL гарантировал, что маркер имеет правильный синтаксис, но никакая
другая проверка не была выполнена. role
будет
содержать роль, в которую пользователь запросил вход. Обратный вызов должен
установить выходные параметры в структуре result
, которая
определена следующим образом:
typedef struct ValidatorModuleResult { bool authorized; char *authn_id; } ValidatorModuleResult;
Соединение будет продолжено только в том случае, если модуль установит
result->authorized
в true
. Для
аутентификации пользователя, аутентифицированное имя пользователя (определенное с использованием
токена) должно быть выделено с помощью palloc и возвращено в поле result->authn_id
.
Альтернативно, result->authn_id
может быть установлено в
NULL, если токен действителен, но связанная с ним личность пользователя не может быть
определена.
Валидатор может вернуть false
, чтобы сигнализировать о внутренней ошибке,
в этом случае любые параметры результата игнорируются, и соединение не удается.
В противном случае валидатор должен вернуть true
, чтобы указать,
что он обработал токен и принял решение об авторизации.
Поведение после возврата validate_cb
зависит от
конкретной настройки HBA. Обычно имя пользователя result->authn_id
должно точно совпадать с ролью, под которой пользователь входит в систему. (Это
поведение может быть изменено с помощью usermap.) Но при аутентификации по
правилу HBA с включенной опцией delegate_ident_mapping
,
Tantor SE не будет выполнять никаких проверок значения
result->authn_id
; в этом случае задача валидатора — убедиться, что токен
предоставляет достаточно привилегий для входа пользователя под указанной ролью
.
49.3.3. Shutdown Callback #
shutdown_cb
обратный вызов выполняется, когда процесс
бэкенда, связанный с соединением, завершает работу. Если у модуля валидатора
есть какое-либо выделенное состояние, этот обратный вызов должен освободить его,
чтобы избежать утечек ресурсов.
typedef void (*ValidatorShutdownCB) (ValidatorModuleState *state);