"Workload Identity Federation"(工作负载身份联合),即 WIF,允许您的工作负载使用短期的 "OpenID Connect"(OIDC)令牌而非长期的 sk-ant-... API 密钥向 Claude API 进行身份验证。这些令牌来自您已在运营的 "identity provider"(身份提供商),即 IdP:AWS IAM、Google Cloud,或任何符合标准的 OIDC 颁发者,例如 GitHub Actions、Kubernetes、SPIFFE、Microsoft Entra ID 或 Okta。
您的工作负载出示由身份提供商签名的 JWT。Anthropic 根据您在 Claude Console 中配置的信任规则对其进行验证,然后返回一个绑定到您组织中某个服务账户的短期 Anthropic 访问令牌。无需生成、存储在 CI 中、轮换或担心泄露任何静态密钥。
工作负载身份联合通过将静态 API 密钥替换为几分钟内即过期(而非永不过期)的令牌来增强您的安全态势。但它本身并不是完整的安全方案:联合身份验证的安全性取决于签署 JWT 的上游身份提供商。请将工作负载身份联合与您的 IdP 已支持的控制措施(工作负载身份绑定、条件访问、审计日志)结合使用,以实现纵深防御。
在任何工作负载可以进行联合之前,您需要在 Claude Console 中配置三种资源。它们共同表达了"由颁发者 X 签名、声明符合 Y 特征的令牌,可以作为服务账户 Z 执行操作"。
服务账户(svac_...)是您的 Anthropic 组织内的一个具名的非人类身份。它是联合令牌所代表的主体。服务账户存在于组织级别,当您将其添加为某个工作区的成员时,它便在该工作区中生效。在令牌交换时,Anthropic 会检查联合规则的工作区是否与服务账户的工作区成员资格之一匹配;随后生成的令牌将遵循该工作区的速率限制和用量归属,与 API 密钥相同。与人类用户不同,服务账户没有电子邮件、没有密码,也无法登录 Console。
与 API 密钥的关键区别在于:API 密钥本身就是凭据,而服务账户则是按需为其生成凭据。您可以审计哪些工作负载以哪个服务账户的身份执行了操作。
联合颁发者(fdis_...)将一个 OIDC 身份提供商注册到您的组织。注册颁发者即告知 Anthropic:"由此提供商签名的 JWT 可以为我的组织声明工作负载身份。"
颁发者有两项配置:
iss 声明值,例如 https://token.actions.githubusercontent.com 或 https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLE。/.well-known/openid-configuration 的提供商,请使用 discovery(默认值)。使用 explicit_url 可直接指向 JWKS 端点,或使用 inline 上传密钥集,适用于无法从公共互联网访问的颁发者(例如私有 Kubernetes 集群)。颁发者和 JWKS URL 必须使用 https、端口 443,并使用可解析为公共 IP 地址的公共 DNS 主机名;不接受 IP 字面量。这些约束仅适用于 Anthropic 需要获取的 URL;在 explicit_url 和 inline 模式下,issuer_url 仅作为字符串进行比较,可以引用内部主机名。
通常每个环境注册一个颁发者:您的生产 EKS 集群、预发布集群和 GitHub Actions 是三个独立的颁发者。
联合规则(fdrl_...)是颁发者与服务账户之间的桥梁:"当来自颁发者 X 的 JWT 具有符合 Y 特征的声明时,为服务账户 Z 生成一个作用域为 S 的令牌。"
规则定义了匹配条件、目标,以及规则匹配时适用的授权作用域和令牌生命周期:
subject_prefix(例如 system:serviceaccount:prod:worker,或以尾部 * 进行前缀匹配)、精确的 audience、精确声明值的映射、用于复杂逻辑的 CEL condition 表达式,或它们的任意组合。必须至少设置 subject_prefix、claims 或 condition 中的一项,且所有已配置的匹配器都必须通过,JWT 才会被接受。scope。默认值为 workspace:developer,它授予的访问权限与为该工作区颁发的 API 密钥相同。某些产品在您从其流程中创建规则时会锁定作用域;例如,MCP 隧道的创建隧道对话框会创建作用域为 org:manage_tunnels 的规则。请参阅 OAuth 作用域。规则还会设置 token_lifetime_seconds(60 到 86400,默认 3600)。单个颁发者可以有多条规则:每个团队、命名空间或权限级别各一条。规则按 ID 进行评估:客户端在交换请求中指定要使用的规则,Anthropic 验证 JWT 是否满足该规则的匹配条件。不存在隐式的规则搜索。
iss 声明标识提供商,其 sub 和其他声明标识具体的工作负载。jwt-bearer 授权类型将 JWT 发送到 POST /v1/oauth/token。Anthropic 根据颁发者的 JWKS 和联合规则的匹配条件验证 JWT,然后返回一个短期的 sk-ant-oat01-... 令牌,该令牌代表规则的目标服务账户执行操作。api_key,然后照常调用 API。SDK 会在令牌过期前重新执行交换。您需要拥有 Anthropic 组织的管理员访问权限、一个支持 OIDC 且具有可访问的 JWKS 端点的身份提供商(或者对于隔离网络的集群,需要一份可粘贴的 JWKS 文档),以及一个能够从该提供商获取身份令牌的工作负载。
在 Claude Console 中,前往 Settings → Workload identity。
注册颁发者
在 Issuers 选项卡上,选择 Create issuer。
| 字段 | 值 |
|---|---|
| Name | 供您参考的标签,例如 prod-eks 或 gha。小写字母、数字和连字符。 |
| Issuer URL | 您的 IdP 在其 JWT 中放置的确切 iss 声明。如果不确定,请解码一个示例令牌:jq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson | .iss' token |
| JWKS source | 对于大多数托管 IdP,使用 discovery。仅当发现机制不可用时才选择 explicit_url 或 inline。 |
| Discovery base / JWKS URL / Inline keys | 取决于模式。当 IdP 在颁发者 URL 上提供 .well-known 时,发现模式下留空即可。 |
| CA cert PEM | 仅当您的 IdP 使用私有 CA 提供 TLS 时填写。大多数托管 IdP 使用公共 CA,因此留空即可。 |
Console 包含针对 AWS 和 Google Cloud 的预设,可预填充颁发者 URL 模式和合理的默认规则,另外还提供通用 OIDC 选项,适用于任何其他符合标准的提供商(例如 GitHub Actions、Kubernetes 服务账户颁发者、Microsoft Entra ID 或 Okta)。
创建服务账户
前往 Settings → Service accounts → Create service account。提供一个名称(例如 inference-worker 或 ci-deploy)和可选的描述。
这是您生成的令牌所代表的身份。从每个工作区的 Members 页面将该服务账户添加到它应在其中执行操作的工作区。下一步中的联合规则针对一个工作区,生成的令牌的作用域限定于该工作区的速率限制和用量归属。记下服务账户 ID(svac_...)。
创建联合规则
返回 Workload identity 页面,打开 Federation rules 选项卡并选择 Create rule。
| 部分 | 值 |
|---|---|
| Basic info | 名称和可选描述。选择您在第 1 步中注册的颁发者。 |
| Match | 选择 Static 进行主题前缀、受众和精确声明匹配,或选择 CEL 使用表达式。请尽可能根据您的 IdP 声明进行精确匹配:匹配范围过宽的规则会授予超出您预期的访问权限。 |
| Target | 选择您在第 2 步中创建的服务账户。 |
| Authorization | OAuth 作用域(默认为 workspace:developer,或产品特定的作用域,例如 org:manage_tunnels;请参阅 OAuth 作用域)和令牌生命周期(以秒为单位)。 |
记下规则的 ID(fdrl_...)。您的工作负载在每次令牌交换请求中都会传递此 ID。
配置好联合后,您的工作负载在运行时将其 IdP 颁发的 JWT 交换为 Anthropic 令牌。SDK 会为您处理交换和刷新循环。cURL 选项卡展示了底层的 HTTP 交换,适用于 shell 脚本、调试或没有 SDK 支持的语言。
您可以使用显式凭据或不带任何参数来构造客户端。不带参数时,SDK 会从环境变量或活动配置文件中解析凭据,如凭据优先级中所述。零参数形式是生产工作负载的推荐模式:在所有环境中部署相同的容器镜像,并按环境注入 ANTHROPIC_FEDERATION_RULE_ID、ANTHROPIC_ORGANIZATION_ID、ANTHROPIC_SERVICE_ACCOUNT_ID、ANTHROPIC_WORKSPACE_ID 和 ANTHROPIC_IDENTITY_TOKEN_FILE。
from anthropic import Anthropic, WorkloadIdentityCredentials, IdentityTokenFile
client = Anthropic(
credentials=WorkloadIdentityCredentials(
identity_token_provider=IdentityTokenFile(
"/var/run/secrets/anthropic.com/token"
),
federation_rule_id="fdrl_...",
organization_id="00000000-0000-0000-0000-000000000000",
service_account_id="svac_...",
workspace_id="wrkspc_...",
),
)
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message.content[0].text)令牌交换响应遵循 RFC 6749 §5.1。有关字段参考,请参阅令牌交换响应。
每个 SDK 都按相同的五层顺序解析凭据:构造函数参数,然后是 ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN,然后是显式的 ANTHROPIC_PROFILE,然后是联合环境变量,最后是隐式的活动配置文件。第一个产生凭据的来源胜出。
ANTHROPIC_API_KEY 位于联合层级之上,因此环境中遗留的密钥会悄无声息地覆盖联合配置。在将工作负载从 API 密钥迁移到工作负载身份联合时,请确认在该工作负载运行的所有位置(容器环境、CI 密钥、shell 配置文件)都未设置 ANTHROPIC_API_KEY。CLI 的 ant auth status 命令会报告哪个来源胜出。
有关完整的优先级表、各层级的语义以及配置文件架构,请参阅 WIF 参考中的凭据优先级。
要在不停机的情况下将现有工作负载从静态 API 密钥切换到联合:
ANTHROPIC_API_KEY。ant auth status(或检查 SDK 调试日志)。由于 ANTHROPIC_API_KEY 在优先级链中位于联合层级之上,此阶段 API 密钥仍然胜出。ANTHROPIC_API_KEY。**从 CI 密钥、容器环境和 shell 配置文件中移除它(参见前面的警告)。重新运行 ant auth status 并确认现在选择的是联合来源。生成的 Anthropic 令牌的生命周期取以下两者中的较小值:(a) 规则的 token_lifetime_seconds(默认 3600 秒)和 (b) 您出示的 IdP JWT 剩余生命周期的两倍。结果永远不会少于 60 秒。第二个限制可防止 Anthropic 令牌的存活时间超出其所派生的上游身份太多。
SDK 会缓存令牌,并按照参照 botocore 设计的两层计划进行刷新:
由于 SDK 在每次交换时都会重新读取 ANTHROPIC_IDENTITY_TOKEN_FILE,因此它会透明地获取轮换后的投影令牌(例如,Kubernetes 服务账户令牌会在其 exp 之前很早就进行轮换)。
每份指南都涵盖了该平台上 JWT 的来源、其声明的结构,以及需要注册的颁发者和规则配置。
STS Web 身份令牌,或 EKS IRSA 投影令牌。
来自元数据服务器的 Google 签名身份令牌。
托管身份(IMDS)和 AKS 上的 Entra Workload ID。
使用 Actions OIDC 令牌的无密钥 CI 身份验证。
使用投影服务账户令牌的自管理和本地集群。
使用来自 SPIRE 或其他合规颁发者的 SPIFFE JWT-SVID 的工作负载。
使用客户端凭据流的 Okta 服务应用程序。
Was this page helpful?