49.3. Обратные вызовы валидатора OAuth#

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