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