Okta может выступать в роли провайдера идентификации рабочих нагрузок, выдавая OIDC-токены доступа сервисному приложению через грант OAuth 2.0 client_credentials. Ваша рабочая нагрузка аутентифицируется в Okta (обычно с помощью private_key_jwt, поэтому общий секрет не хранится), получает подписанный «JSON Web Token» (веб-токен JSON), или JWT, и обменивает этот JWT у Anthropic на короткоживущий токен доступа.
URL издателя сервера авторизации Okta имеет вид https://<your-domain>.okta.com/oauth2/<auth-server-id>. Если вы используете встроенный сервер по умолчанию, путь будет /oauth2/default.
Вы должны использовать пользовательский сервер авторизации Okta (включая сервер default). Токены, выданные непосредственно сервером авторизации организации Okta (конечная точка /oauth2/v1/token без идентификатора сервера авторизации в пути), не могут быть проверены внешними сторонами, поскольку Okta не публикует для них ключи подписи.
Существует множество способов настройки и аутентификации в Okta, которые выходят за рамки данной документации. Убедитесь, что ваша конфигурация и механизмы аутентификации соответствуют руководствам и практикам безопасности вашей компании.
/v1/token и обратиться к api.anthropic.com.На верхнем уровне вам необходимо:
Точная навигация зависит от конфигурации вашей организации Okta и версии консоли администратора. Следующие пронумерованные шаги описывают один из распространённых путей:
private_key_jwt) и зарегистрируйте публичный JWK вашей рабочей нагрузки. В качестве альтернативы используйте клиентский секрет, если ваша среда может безопасно его хранить. Для следующего примера вам может потребоваться отключить требование DPoP в приложении; убедитесь, что ваша производственная конфигурация соответствует требованиям безопасности вашей организации.https://api.anthropic.com, чтобы выдаваемые токены доступа содержали это утверждение aud. Anthropic проверяет aud на соответствие этому фиксированному значению.anthropic.access). Okta отклоняет запросы client_credentials, которые не включают предоставленную область действия.Для сервисного приложения, использующего client_credentials, Okta устанавливает утверждение sub выданного токена доступа равным Client ID приложения, а iss — URL издателя сервера авторизации.
В Claude Console откройте Settings → Workload identity, нажмите Connect workload и выберите Custom OIDC. Мастер проведёт вас через регистрацию издателя, создание сервисного аккаунта и создание правила федерации.
Мастер создаёт эти ресурсы за вас. Используйте следующие значения независимо от того, вводите ли вы их в мастере или отправляете в Admin API:
Издатель федерации: Используйте URL вашего пользовательского сервера авторизации Okta и режим обнаружения. Anthropic считывает документ обнаружения Okta .well-known/openid-configuration и получает JWKS из указанного в нём jwks_uri.
{
"name": "okta-prod",
"issuer_url": "https://acme.okta.com/oauth2/aus1a2b3c4d5e6f7g8h9",
"jwks": { "type": "discovery" }
}Правило федерации: Выполняйте сопоставление по утверждению Okta sub, которое является Client ID сервисного приложения. Если вы определили пользовательские утверждения в Okta, вы можете вместо этого выполнять сопоставление по ним с помощью карты claims или CEL-выражения condition.
{
"name": "okta-pipeline",
"issuer_id": "fdis_...",
"match": {
"subject_prefix": "0oa1b2c3d4e5f6g7h8i9",
"audience": "https://api.anthropic.com"
},
"target": { "type": "service_account", "service_account_id": "svac_..." },
"workspace_id": "wrkspc_...",
"oauth_scope": "workspace:developer",
"token_lifetime_seconds": 600
}В отличие от платформенно-нативных провайдеров (AWS, Google Cloud, Kubernetes), которые делают токен доступным внутри среды выполнения рабочей нагрузки (через проецируемый файл или локальную конечную точку метаданных), Okta этого не делает. Ваша рабочая нагрузка должна вызвать конечную точку токенов Okta, чтобы получить JWT, а затем передать этот JWT в SDK Anthropic в качестве токена идентификации.
import os
import httpx
import anthropic
from anthropic import WorkloadIdentityCredentials
def fetch_okta_token() -> str:
response = httpx.post(
f"{os.environ['OKTA_ISSUER']}/v1/token",
data={
"grant_type": "client_credentials",
"scope": "anthropic.access",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
# Создайте JWT client_assertion по RFC 7523, подписанный закрытым ключом вашего приложения Okta
"client_assertion": build_signed_client_assertion(),
},
)
response.raise_for_status()
return response.json()["access_token"]
client = anthropic.Anthropic(
credentials=WorkloadIdentityCredentials(
identity_token_provider=fetch_okta_token,
federation_rule_id=os.environ["ANTHROPIC_FEDERATION_RULE_ID"],
organization_id=os.environ["ANTHROPIC_ORGANIZATION_ID"],
service_account_id=os.environ["ANTHROPIC_SERVICE_ACCOUNT_ID"],
workspace_id=os.environ.get("ANTHROPIC_WORKSPACE_ID"),
),
)
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message.content[0].text)Каждая вкладка SDK демонстрирует паттерн с вызываемым объектом: SDK Anthropic повторно вызывает ваш провайдер токена идентификации всякий раз, когда токен доступа Anthropic приближается к истечению срока действия, поэтому ваша функция получения токена Okta должна возвращать свежий токен при каждом вызове, а не кэшировать один токен бессрочно. CLI ant повторно считывает ANTHROPIC_IDENTITY_TOKEN_FILE при каждом обмене, поэтому обновляйте этот файл по таймеру для долго работающих оболочек.
Успешный обмен возвращает access_token, начинающийся с sk-ant-oat01-, и значение expires_in в секундах. При ошибке 400 invalid_grant см. раздел Устранение неполадок при неудачном обмене; наиболее распространённая причина со стороны Okta — несоответствие issuer_url (он должен включать путь /oauth2/<auth-server-id>; сервер авторизации организации Okta использовать нельзя).
Несколько сервисных приложений под одним сервером авторизации Okta используют
одного и того же издателя. Правило, в котором отсутствует subject_prefix,
соответствует каждому сервисному приложению на этом сервере, поэтому любая
команда, которая может зарегистрировать такое приложение, сможет получить
федеративный токен Anthropic.
Ограничьте блок match правила до минимальной области, подходящей для вашего сценария использования:
subject_prefix равным полному Client ID сервисного приложения без завершающего *.audience, которое вы настроили на сервере авторизации, чтобы токены, выпущенные для другой аудитории, отклонялись.claims правила или CEL-выражения condition.Was this page helpful?