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 издателя сервера авторизации.
Следуйте пошаговому руководству по настройке, чтобы зарегистрировать издателя федерации, создать сервисный аккаунт Anthropic и создать правило федерации в Claude Console. Используйте следующие значения, специфичные для Okta.
Издатель федерации: Используйте URL вашего пользовательского сервера авторизации Okta и режим обнаружения. Anthropic считывает документ обнаружения Okta .well-known/openid-configuration и получает JWKS из указанного в нём jwks_uri.
{
"name": "okta-prod",
"issuer_url": "https://acme.okta.com/oauth2/aus1a2b3c4d5e6f7g8h9",
"jwks_source": "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-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message.content[0].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?