OAuth 验证器模块通过定义一组回调来实现其功能。 服务器会按需调用这些回调,以处理来自用户的认证请求。
startup_cb 回调在模块加载后立即执行。 该回调用于建立本地状态,并在需要时执行额外初始化。 若验证器模块需要保存状态,可使用 state->private_data 存储。
typedef void (*ValidatorStartupCB) (ValidatorModuleState *state);
validate_cb 回调在 OAuth 交换过程中执行, 即用户尝试使用 OAuth 进行认证时。 之前调用中设置的任何状态都可通过 state->private_data 访问。
typedef bool (*ValidatorValidateCB) (const ValidatorModuleState *state,
const char *token, const char *role,
ValidatorModuleResult *result);
token 包含待校验的 Bearer 令牌。 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 中的用户名 必须与用户要登录的角色完全匹配(该行为可通过用户名映射修改)。 但如果根据启用了 delegate_ident_mapping 的 HBA 规则进行认证, PostgreSQL 不会对 result->authn_id 的值做任何检查; 此时由验证器负责确保令牌具备足够权限, 以便用户能以指定的 role 登录。
shutdown_cb 回调在与连接关联的后端进程退出时执行。 如果验证器模块分配了状态, 该回调应释放相关资源以避免泄漏。
typedef void (*ValidatorShutdownCB) (ValidatorModuleState *state);
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。