# Эндпоинт выдачи токенов OAuth 2.0 (RFC 6749 §3.2)

export default function Layout(props) {
  const { OpenAPIPage } = props.components ?? {};
  return (
    <>
      {props.children}
      ## Эндпоинт выдачи токенов OAuth 2.0 (RFC 6749 §3.2)

`POST /oauth/token`

**Параметры**

| Имя | Где | Обязательный | Тип | Описание |
| --- | --- | --- | --- | --- |
| `idempotency-key` | header | нет | string | Ключ идемпотентности для безопасного повтора запроса: 8–255 символов из набора A-Za-z0-9_.:+/=-, ответ кэшируется на 24 ч |

**Тело запроса** (`application/x-www-form-urlencoded`, обязательное): OAuthTokenRequest
- `act_as_service_principal`: string — Сервис-принципал для делегирования
- `audience`: string — Audience целевого токена (RFC 8693)
- `client_id`: string — client_id (если клиент не аутентифицируется через Basic)
- `client_secret`: string — client_secret confidential-клиента
- `code`: string — Authorization code (для authorization_code)
- `code_verifier`: string — Параметр code_verifier (PKCE)
- `grant_type`: string, обязательное — Grant-тип: authorization_code, refresh_token, client_credentials или token-exchange (RFC 8693)
- `redirect_uri`: string — redirect_uri из authorize-запроса
- `refresh_token`: string — Refresh-токен (для refresh_token)
- `requested_token_type`: string — Запрашиваемый тип токена (RFC 8693)
- `resource`: string — Целевой ресурс (RFC 8707)
- `scope`: string — Запрашиваемые scope через пробел
- `subject_token`: string — Обмениваемый токен или персональный ключ (RFC 8693)
- `subject_token_type`: string — Тип обмениваемого токена (RFC 8693); для персонального ключа — urn:legalstack:params:oauth:token-type:personal-token, обмен требует DPoP-доказательства
- `team_id`: string — Команда для client_credentials-токена
- `witness_id`: string — Witness-идентификатор для witness-токенов
- `witnessed_user_id`: string — Пользователь, действия которого заверяются

**Ответы**

- `200` — Токены выданы (`application/json`, OAuthTokenResponse)
  - `access_token`: string, обязательное — Access-токен (JWT, RFC 9068)
  - `expires_in`: number, обязательное — Срок жизни access-токена в секундах
  - `issued_token_type`: string — Тип выданного токена при обмене (RFC 8693)
  - `refresh_token`: string — Refresh-токен (при соответствующем grant-типе)
  - `scope`: string — Выданные scope через пробел
  - `token_type`: string, обязательное — Тип токена: DPoP для токена, привязанного к ключу клиента, Bearer для токена, привязанного к mTLS-сертификату
- `400` — Некорректный запрос (`application/json`, OAuthError)
- `401` — Ошибка аутентификации клиента (`application/json`, OAuthError)
- `429` — Превышен лимит запросов, повторите через Retry-After секунд (`application/problem+json`, ProblemDetails)
- `503` — Проверка доступа временно недоступна (`application/json`, OAuthError)

    </>
  );
}
