Los módulos validadores de OAuth implementan su funcionalidad definiendo un conjunto de devoluciones de llamada. El servidor las llamará según sea necesario para procesar la solicitud de autenticación del usuario.
La devolución de llamada startup_cb se ejecuta directamente después
de cargar el módulo. Esta devolución de llamada se puede utilizar para configurar el estado local y
realizar una inicialización adicional si es necesario. Si el módulo validador
tiene estado, puede utilizar state->private_data para
almacenarlo.
typedef void (*ValidatorStartupCB) (ValidatorModuleState *state);
La devolución de llamada validate_cb se ejecuta durante el intercambio de OAuth
cuando un usuario intenta autenticarse utilizando OAuth. Cualquier estado configurado en
las llamadas anteriores estará disponible en state->private_data.
typedef bool (*ValidatorValidateCB) (const ValidatorModuleState *state,
const char *token, const char *role,
ValidatorModuleResult *result);
token contendrá el token portador (bearer token) a validar.
PostgreSQL se ha asegurado de que el token esté bien formado sintácticamente, pero no se
ha realizado ninguna otra validación. role contendrá el rol con el que el usuario
ha solicitado iniciar sesión. La devolución de llamada debe configurar los parámetros de salida en la estructura
result, que se define a continuación:
typedef struct ValidatorModuleResult
{
bool authorized;
char *authn_id;
} ValidatorModuleResult;
La conexión solo continuará si el módulo establece
result->authorized en true. Para
autenticar al usuario, el nombre de usuario autenticado (determinado a partir del
token) se reservará con palloc y se devolverá en el campo result->authn_id.
Alternativamente, result->authn_id puede establecerse en
NULL si el token es válido pero no se puede determinar la identidad del usuario
asociado.
Un validador puede devolver false para indicar un error interno,
en cuyo caso se ignoran los parámetros del resultado y la conexión falla.
De lo contrario, el validador debe devolver true para indicar
que ha procesado el token y ha tomado una decisión de autorización.
El comportamiento después de que retorne validate_cb depende de la
configuración específica del HBA. Normalmente, el nombre de usuario de
result->authn_id debe coincidir exactamente con el rol con el que el usuario
está iniciando sesión. (Este comportamiento puede modificarse con un mapa de usuario). Pero al autenticar
contra una regla HBA con delegate_ident_mapping activado,
PostgreSQL no realizará ninguna comprobación en el valor de
result->authn_id en absoluto; en este caso, corresponde al
validador asegurarse de que el token tenga suficientes privilegios para que el usuario pueda
iniciar sesión bajo el role indicado.
La devolución de llamada shutdown_cb se ejecuta cuando el proceso
de backend asociado con la conexión finaliza. Si el módulo validador tiene
algún estado asignado, esta devolución de llamada debe liberarlo para evitar fugas de recursos.
typedef void (*ValidatorShutdownCB) (ValidatorModuleState *state);