OpenAI 工作负载身份联合

2026-11-09 15:44 更新

工作负载身份联合(Workload Identity Federation,WIF)让可信工作负载使用已有身份,而不保存长期 OpenAI API 密钥或 ChatGPT 凭证。工作负载提交身份提供商的短期令牌,OpenAI 将其换为短期访问令牌。API 工作负载还可通过 X.509 联合交换已验证的证书身份。

对比项 OpenAI API Codex
OpenAI 身份 API Platform 项目中的服务账户 受管理 ChatGPT 工作区的用户或服务账户
管理入口 OpenAI Platform OpenAI Admin Portal
工作负载连接方式 SDK 或令牌交换端点 Codex 环境变量和身份令牌文件
令牌可访问内容 映射服务账户可用的 API 与权限 映射工作区主体已有的 Codex 访问

两种方式信任模型相同,管理与运行配置不同。API 路径见使用 API 工作负载身份,Codex 路径见使用 Codex 工作负载身份;规则与生命周期见联合规则参考。

工作原理

管理员预先配置三项:身份提供商说明可信签发者及如何验证令牌/证书;访问规则说明接受哪些属性、可代表哪个 OpenAI 身份(API 称服务账户映射,Codex 称联合规则);目标主体获得访问(API 为 Platform 服务账户,Codex 为受管理工作区用户/服务账户)。

运行时,工作负载取得短期 OIDC JWT、SPIFFE JWT-SVID,或 API 工作负载提交 X.509 证书;连同产品要求的 ID 呈交外部身份;OpenAI 验证身份并评估映射或规则,随后为映射主体签发短期令牌。交换不会创建主体、项目或工作区成员关系,这些须事先创建或选择。

获取身份令牌

按运行环境选择:

  • X.509:API 证书交换。
  • Kubernetes:自管理集群的投射服务账户令牌。
  • AWS:出站联合或 EKS 投射令牌。
  • Microsoft Azure:托管身份或 AKS 投射令牌。
  • Google Cloud:元数据服务器身份令牌或 GKE 投射令牌。
  • OCI:Oracle 身份域中的实例主体令牌。
  • GitHub Actions:CI 的 OIDC 令牌。
  • SPIFFE:SPIRE 或兼容提供商的 JWT-SVID。
  • Idira:Secure Workload Access 的 JWT-SVID。

支持文档所列配置中的 OIDC 兼容 JWT,包括 SPIFFE JWT-SVID。API 提供商未列出时联系支持;Codex 在 Admin Portal 中选 Custom OIDC。Codex 用户仅执行各指南的令牌签发步骤,再返回本页 Codex 小节;各提供商的 OpenAI 配置与 SDK 示例属于 API 路径。X.509 仅支持 API 路径。

在 OpenAI API 中使用工作负载身份

需要组织内管理提供商和服务账户映射的权限。到组织设置 > Security > Workload Identity Provider先创建提供商,再在详情页配置映射。

X.509 提供商

它从证书派生身份属性,复用组织现有 mTLS 验证,不另存证书或独立信任库。先在组织 mTLS 设置配置并激活客户端证书所链到的信任锚。权限、证书、作用域、主机、链验证、CEL 和轮换见 mTLS 指南。

创建提供商,派生一个非空 openai.subject,映射至最小权限项目服务账户。工作负载向 X.509 端点提交证书换取令牌,再向 API mTLS 主机同时发送 bearer 与被接受的证书;完整流程见 X.509 指南。

配置 OIDC 工作负载身份提供商

每个可信外部签发者创建一个提供商,支持 OIDC JWT 主体令牌。配置项如下:

选项 说明
名称(Name) 组织内唯一提供商名称
OIDC签发者URL(OIDC Issuer URL) 预期issuer,比较时忽略末尾斜杠
受众(Audience) 外部主体令牌预期 aud
描述(Description) 可选描述
自定义OIDC发现开关 启用后从公开HTTPS位置获取发现元数据,该位置可不同于issuer
自定义OIDC发现URL 发现基址或完整 /.well-known/openid-configuration URL
上传JWKS验证开关 以上传JWKS验证,替代发现公钥
JWKS JSON 非空 keys 数组的公有JWKS,不含私钥
属性转换(Attribute transformations) 用CEL从声明派生 openai.* 映射属性

自定义 OIDC 发现和上传 JWKS 互斥;启用前者会隐藏后者。自定义发现 URL 必须为公开 HTTPS,不含凭证、自定义端口、查询或片段。界面没有该选项时用标准发现,或上传提供商公开 JWKS,并随签名密钥轮换更新。

签发者与发现主机不同,OIDC Issuer URL 仍设为令牌 iss,Custom OIDC discovery URL 指向发布发现文档的位置;自定义 URL 只改变发现元数据/公钥的获取位置,不改变签发者验证。

使用 CEL 转换令牌声明

属性转换采用 CEL 标准语法,不增加 WIF 自定义函数。表达式根对象 assertion 是已验证 JWT 声明集合。控制台自动加 openai. 前缀;输入后缀 subject、表达式 assertion.sub,存为 openai.subject。

来源示例 1(json):

中文说明:来源配置或结果示例,按所在小节的字段、作用域与权限要求解释;JSON保持合法格式,CEL/声明匹配文本不是可独立运行的应用。

[
  {
    "attribute": "openai.subject",
    "expression": "assertion.sub"
  },
  {
    "attribute": "openai.repository",
    "expression": "assertion.repository"
  }
]

可读取 assertion.sub、assertion.repository 等,不支持的语法/函数会导致映射失败:

来源示例 2(json):

中文说明:来源配置或结果示例,按所在小节的字段、作用域与权限要求解释;JSON保持合法格式,CEL/声明匹配文本不是可独立运行的应用。

[
  {
    "attribute": "openai.repository_ref",
    "expression": "assertion.repository + \"@\" + assertion.ref"
  },
  {
    "attribute": "openai.production",
    "expression": "assertion.ref == \"refs/heads/main\""
  }
]

结果必须为字符串、布尔值、整数或有限数;数组、对象、null 和求值错误均失败。比较前将标量转为字符串,例如 true 变为 "true",7 变为 "7"。以 openai. 开头的映射键只从转换读取;令牌原始同名前缀声明不会自动参与匹配。

管理 JWKS 与密钥轮换

标准发现先获取 /.well-known/openid-configuration,再获取 jwks_uri,发现文档与远程 JWKS 缓存 600 秒。自定义发现从指定基址获取文档,但 iss 仍须匹配配置。缓存找不到 kid 时,会刷新 JWKS 并再查一次。

上传 JWKS 模式不执行发现或远程获取;提供商更新对交换生效后,使用保存的 JWKS。可有多个公钥,但各 kid 必须唯一且非空。

轮换期间同时公布新旧公钥,让旧令牌继续工作。上传模式须在签发新 kid 令牌前更新配置,不存在于配置的密钥签名会被拒绝。

配置服务账户映射

映射规定哪些外部身份能为指定服务账户取得令牌。X.509 只用派生 openai.* 属性,优先精确 openai.subject;原始 sub、aud、iss 仅适用于 OIDC。

选项 说明
名称(Name) 提供商内唯一映射名称
键(Key) 原始 sub、aud、iss,或派生 openai.subject 等属性键
值(Value) 签发前必须匹配的属性值
描述(Description) 可选说明
项目(Project) 目标服务账户所属项目
服务账户(Service account) 可新建或选择项目现有账户
权限(Permissions) 可选API限制,只收窄,不能超出服务账户本身权限

属性值须为 JSON 标量。字符串允许非空前缀后一个末尾通配符,如 repo:openai/*、repository:my-org/*;不支持 *、repo:*:prod、repo/*/main。界面 Permissions 对应交换响应 OAuth scope,只能收窄服务账户权限,不可包含 Admin API scopes,下游授权仍适用。

映射解析示例

外部身份验证后,仅查找请求 identity_provider_id 和 service_account_id 的映射,跳过未启用项,按每个映射所需属性求值;只有恰好一个启用映射满足全部属性时才签发。

假设 GitHub 令牌声明如下:

来源示例 3(json):

中文说明:来源配置或结果示例,按所在小节的字段、作用域与权限要求解释;JSON保持合法格式,CEL/声明匹配文本不是可独立运行的应用。

{
  "iss": "https://token.actions.githubusercontent.com",
  "aud": "https://api.openai.com/v1",
  "sub": "repo:my-org/my-repo:ref:refs/heads/main",
  "repository": "my-org/my-repo",
  "ref": "refs/heads/main"
}

派生属性:

来源示例 4(json):

中文说明:来源配置或结果示例,按所在小节的字段、作用域与权限要求解释;JSON保持合法格式,CEL/声明匹配文本不是可独立运行的应用。

[
  {
    "attribute": "openai.repository_ref",
    "expression": "assertion.repository + \"@\" + assertion.ref"
  }
]

映射同时要求原始与派生属性:

键 值
iss https://token.actions.githubusercontent.com
sub repo:my-org/my-repo:*
openai.repository_ref my-org/my-repo@refs/heads/main

三行必须全匹配。sub 末尾通配符匹配 repo:my-org/my-repo: 前缀;openai.repository_ref 从转换而非原始同名声明读取。多个映射匹配会拒绝;每个提供商/服务账户组合须唯一,不合并映射权限。

连接工作负载

使用对应提供商的 SDK 示例或直接交换端点。字段、授权及限制见交换接口参考。

续期访问令牌

自行管理交换时,应一同传递 access_token 和 expires_at。后者是秒级 Unix UTC 绝对到期时间,须提前续期并留出时钟、网络余量。expires_in 从签发时计时;12:00 签发、3600 秒有效,即使12:05才收到也仍于13:00到期,传输不会延长寿命。参见响应字段。不返回刷新令牌,续期要用有效外部令牌或证书重新交换。

在 Codex 中使用工作负载身份

用于受管理 ChatGPT 工作区的可信自动化,将工作负载映射到 ChatGPT 用户或服务账户,而非 API Platform 服务账户。此能力处于 beta,须为工作区开通;请联系 OpenAI 代表或支持。规则参考说明一条规则如何接受多个外部主体并映射到一个 ChatGPT 主体。

连接故障排查

OpenAI 拒绝身份令牌

本地解码并对照 iss、aud、sub、exp、iat 及提供商特有声明,不向第三方 JWT 网站粘贴生产令牌。API 比较服务账户映射,Codex 比较联合规则。

API 映射不匹配

确认使用正确提供商和服务账户 ID、映射活动且恰好匹配一条。详见交换错误参考。

Codex 提示配置不完整

确认进程具有两个必需的工作负载身份环境变量,OPENAI_IDENTITY_TOKEN_FILE 是当前令牌的绝对路径,检查文件及父目录权限。

Codex 使用了其他凭证

两个必需变量都应加载。任一变量出现就会优先选择 WIF,而不是 API 密钥、访问令牌或已保存登录。加载下载的配置后启动新进程,再运行 codex login status。

安全建议

每应用/工作负载专用主体,隔离生产与非生产;优先精确声明匹配而非宽泛模式;最小权限与短期令牌;定期清理闲置提供商、映射、规则,检查交换错误与异常访问。

相关文档

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号