Okta может выступать в качестве поставщика идентификации рабочих нагрузок (workload identity provider), выдавая OIDC-токены доступа сервисному приложению (service application) через грант OAuth 2.0 client_credentials. Ваша рабочая нагрузка аутентифицируется в Okta (обычно с помощью private_key_jwt, поэтому общий секрет не хранится), получает подписанный "JSON Web Token" (веб-токен JSON), или JWT, и обменивает этот JWT у Anthropic на краткосрочный токен доступа.
URL-адрес издателя (issuer) сервера авторизации 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 и режим обнаружения (discovery). 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 в Anthropic SDK в качестве токена идентификации.
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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(next(block.text for block in message.content if block.type == "text"))Каждая вкладка SDK показывает шаблон с вызываемой функцией: Anthropic SDK снова вызывает ваш поставщик токенов идентификации всякий раз, когда срок действия токена доступа 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?