Oracle Database 23ai不支持JWT或OIDC Token直连,仅支持用户名密码、OS认证、SSL证书三种原生认证方式;OCI托管服务通过IAM临时token映射DB用户属唯一官方支持场景,本地部署需依赖代理层校验token后透传预设凭据。

Oracle Database 23ai(原23c)不支持“无口令 + TOKEN”这种纯外部令牌的原生数据库身份验证方式。它没有内置类似 OAuth2 Bearer Token 或 JWT 直接登录 sqlplus 或 oci_connect() 的机制。所谓“TOKEN验证”,在 Oracle 生态中实际落地时,必须绑定到具体可信通道或前置组件——不是数据库自己验 token,而是由网关/代理/应用层完成 token 校验后,以已知数据库用户身份透传连接。
为什么不能直接用 JWT 或 OIDC Token 连接 Oracle?
Oracle 数据库的认证入口(oci_login、sqlplus、JDBC URL)只接受三类凭据组合:
- 用户名 + 密码(含加密密码、外部密码文件)
- 操作系统认证(
OS_AUTHENT_PREFIX+ OS 用户名) - SSL 客户端证书(需配置 Wallet 和
SQLNET.AUTHENTICATION_SERVICES=(TCPS))
它不解析 HTTP Header、不调用 IDP 接口、不校验 JWT 签名。任何“用 token 登数据库”的说法,本质是混淆了「应用层鉴权」和「数据库层认证」两个边界清晰的环节。
真正可行的 TOKEN 验证链路:OCI IAM + Database Service
唯一官方支持的“token 驱动数据库访问”场景,仅存在于 Oracle Cloud Infrastructure(OCI)托管服务中,依赖 OCI IAM 的短期安全凭证:
- 应用先调用 OCI STS 服务获取临时
security_token(有效期默认 1 小时) - 用该 token + OCI 租户 OCID + 用户 OCID 构造签名请求,向 OCI Database Service 发起连接申请
- OCI 控制平面校验 token 后,动态生成一个临时数据库用户名(如
ocid1.user.oc1..xxxx:temp_20260827_1530)并注入连接池 - 应用拿到的是标准 JDBC/OCI 连接串,背后已完成 token 到 DB 用户的映射
注意:该能力仅限 Exadata Database Service 和 DB System on VM/BM 的 OCI 托管实例,本地部署的 23ai 不具备此功能。
本地部署想模拟 TOKEN 登录?只能靠中间层代理
若你在自有服务器上运行 Oracle 23ai,又希望前端传 JWT 访问数据库,必须自行搭建可信代理层:
- 用 Nginx / Envoy 做反向代理,在入口校验 JWT(通过
auth_request模块或 Lua 脚本调用 Keycloak/Auth0) - 校验通过后,重写请求头或 URL 参数,注入预设的数据库用户名(如
X-DB-User: app_user_123) - 后端应用从请求头读取该用户名,拼接固定密码(或从 Vault 获取),再调用
oci_connect("app_user_123", "vault_retrieved_pwd") - 数据库侧需提前创建对应用户,并启用
CREATE USER app_user_123 IDENTIFIED GLOBALLY AS 'CN=app-proxy,OU=services,O=corp'实现全局认证(需配置 SSL/Wallet)
这个方案里,token 只活在代理到应用之间;数据库永远只看到用户名+密码或证书,不会接触原始 token 字符串。
最容易被忽略的一点:Oracle 23ai 的 DBMS_CLOUD.GET_OBJECT 或 APEX_WEB_SERVICE 等函数虽能携带 HTTP Header,但它们是用于访问外部 API 的,不能反向用来让外部用 token 登自己。别在 tnsnames.ora 里加 token 参数——它根本不认。


















