2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18)
开发版本: devel

50.3. OAuth 验证器回调 #

OAuth 验证器模块通过定义一组回调函数来实现其功能。服务器将在需要时调用它们来处理来自用户的身份验证请求。

50.3.1. 启动回调 #

在加载模块后,会立即执行 startup_cb 回调。如果需要,此回调可用于设置本地状态并执行其他初始化。如果验证器模块有状态,则可以使用 state->private_data 来存储它。

typedef void (*ValidatorStartupCB) (ValidatorModuleState *state);

50.3.2. 验证回调 #

当用户尝试使用 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 登录。

50.3.3. 关闭回调 #

当与连接关联的后端进程退出时,将执行 shutdown_cb 回调。如果验证器模块有任何已分配的状态,则应在此回调中释放它,以避免资源泄漏。

typedef void (*ValidatorShutdownCB) (ValidatorModuleState *state);

提交更正

如果您在文档中发现任何不正确、与您使用特定功能时的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。