PostgreSQL码农集散地

PG 19 OAuth 认证改进,太实用了 看完想立刻升级

PostgreSQL 认证终于"活"过来了!PG 19 这两个大招,太实用了

PG 19 的 OAuth 认证增强,两个改动直击痛点,看完想立刻升级。


PG 19 OAuth 两板斧,彻底解决老难题

PostgreSQL 引入 OAuth 认证后,社区发现两个硬伤:

痛点一:调试只能"全开",Bearer Token 全部明文打印,谁敢在生产用?

痛点二:OAuth 配置只能全局设定,多租户场景根本没法玩。

现在,PG 19 全解决了。


第一板斧:PGOAUTHDEBUG 从"裸奔"到"穿衣出门"

旧设计有多危险?

PGOAUTHDEBUG=UNSAFE

一开,HTTP 流量 + Bearer Token 全部打印到 stderr,敏感信息裸奔。

新设计:按需开启,危险选项强制"打标签"

# 安全用法:只统计调用次数
PGOAUTHDEBUG=call-count

# 危险操作:必须加 UNSAFE: 前缀
PGOAUTHDEBUG=UNSAFE:trace,http

不加前缀?系统直接警告并忽略:

WARNING: PGOAUTHDEBUG option "trace" is unsafe (ignored)

核心逻辑:不安全选项(http/trace/dos-endpoint)必须显式声明 UNSAFE: 前缀。想用 trace?先把"危险"二字写清楚。


第二板斧:HBA 级 OAuth 配置,多租户的救星

老问题

所有 OAuth 连接共用一套 GUC 全局配置,tenant A 和 tenant B 无法差异化。

新方案:每个 HBA 条目独立配置

# pg_hba.conf

# 企业客户 A:专属 issuer + 审计日志
hostssl  postgres  tenant_a  10.0.1.0/24  \
    oauth issuer=https://corp-a.auth.example.com \
    validator.authn_id="corp-a-user" \
    validator.audit_level=verbose

# 普通客户:不同 issuer
hostssl  postgres  public  0.0.0.0/0  \
    oauth issuer=https://public.auth.example.com \
    validator.authn_id="public-user"

验证器模块通过 GetOAuthHBAOption() 获取 per-entry 配置,差异化策略轻松实现。


一句话总结

改动
价值
PGOAUTHDEBUG 细粒度控制
调试不再裸奔令牌
HBA 级 OAuth 选项
多租户差异化配置成为可能

觉得有用?转发给做 PostgreSQL 运维的朋友。

这两个 commit 让 OAuth 认证从"能用"走向"好用",PG19 升级值得期待。


参考资料:

  • PGOAUTHDEBUG 改造:src/interfaces/libpq/oauth-debug.h
  • HBA 级选项注册:RegisterOAuthHBAOptions / GetOAuthHBAOption API
  • 完整解读:公众号回复"OAuth"获取原文链接