"Workload Identity Federation"(工作负载身份联合),即 WIF,允许您的工作负载使用短期的 "OpenID Connect"(OIDC)令牌而非长期的 sk-ant-... API 密钥向 Claude API 进行身份验证。这些令牌来自您已在运营的身份提供商(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 隧道的创建隧道模态框会创建作用域为 workspace: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 文档),以及一个能够从该提供商获取身份令牌的工作负载。
Connect workload(连接工作负载)向导会在一个引导式流程中创建全部三种资源(颁发者、服务账号和联合规则),然后端到端验证连接。
打开连接工作负载
在 Claude Console 中,转到 Settings → Workload identity(设置 → 工作负载身份),然后选择 Connect workload(连接工作负载)。
选择您的提供商
选择您的身份提供商对应的磁贴:GitHub Actions、AWS、Google Cloud、Microsoft Entra ID 或 Kubernetes。每个磁贴会预填充颁发者 URL 模式以及该提供商的 JWT 支持的匹配字段。对于任何其他符合标准的提供商(例如 SPIFFE 或 Okta),请选择 Custom OIDC(自定义 OIDC)。
填写引导字段
向导会引导您完成特定于提供商的字段:颁发者配置、传入 JWT 的匹配条件,以及它所创建的服务账号和联合规则的名称。向导会预填充 oauth_scope=workspace:developer 和 token_lifetime_seconds=600(当省略 token_lifetime_seconds 时,API 的默认值为 3600);如果您的工作负载需要不同的作用域或生命周期,请调整这些值。
验证颁发者
可选择 Verify issuer(验证颁发者)以在创建任何内容之前试运行颁发者配置。验证会确认 Anthropic 能够从您输入的 URL 获取并解析 JWKS,从而及早发现可达性和配置错误。
测试连接
向导会创建颁发者、服务账号和联合规则,然后在 15 分钟内监听一次成功的令牌交换。在该时间窗口内从您的工作负载触发一次交换(请参阅从您的工作负载进行身份验证)以确认设置有效。如果时间窗口已过,资源仍会保留;您可以从联合规则的详情页面重新运行测试。请记下向导创建的规则 ID(fdrl_...)和服务账号 ID(svac_...):您的工作负载在每次令牌交换请求中都需要传递这两者,以及您的组织 ID(当规则涵盖多个工作区时,还需传递您的工作区 ID)。
要以编程方式管理这些资源,请参阅使用 Admin API 管理 WIF 获取 curl 操作指南,或参阅服务账号 API 参考、联合颁发者 API 参考和联合规则 API 参考以获取完整的参数详情和响应架构。
配置好联合后,您的工作负载在运行时将其 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 工作负载 ID。
使用 Actions OIDC 令牌的无密钥 CI 身份验证。
使用投影服务账号令牌的自管理和本地集群。
使用来自 SPIRE 或其他合规颁发者的 SPIFFE JWT-SVID 的工作负载。
使用客户端凭据流的 Okta 服务应用程序。
Was this page helpful?