OAuth 验证器模块通过定义一组回调函数来实现其功能。服务器将在需要时调用它们来处理来自用户的身份验证请求。
在加载模块后,会立即执行 startup_cb 回调。如果需要,此回调可用于设置本地状态并执行其他初始化。如果验证器模块有状态,则可以使用 state->private_data 来存储它。
typedef void (*ValidatorStartupCB) (ValidatorModuleState *state);
当用户尝试使用 OAuth 进行身份验证时,会在 OAuth 交换过程中执行 validate_cb 回调。在先前的调用中设置的任何状态都可以在 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 用户名必须与用户登录的角色完全匹配。(此行为可以通过用户映射进行修改。)但是,在启用 delegate_ident_mapping 的 HBA 规则进行身份验证时,PostgreSQL 将不会对 result->authn_id 的值执行任何检查;在这种情况下,由验证器来确保令牌具有足够的权限,以便用户能够以指定的 role 登录。
当与连接关联的后端进程退出时,将执行 shutdown_cb 回调。如果验证器模块有任何已分配的状态,则应在此回调中释放它,以避免资源泄漏。
typedef void (*ValidatorShutdownCB) (ValidatorModuleState *state);