API / Auth / MCP

OAuth Protected Resource (RFC 9728)

Метадокумент /.well-known/oauth-protected-resource, указывающий AI-агентам где получить токен доступа.

Что такое OAuth Protected Resource?

OAuth Protected Resource Metadata (RFC 9728) — JSON-документ по адресу /.well-known/oauth-protected-resource, который описывает защищённый API-ресурс и сообщает AI-агентам, у какого Authorization Server нужно получить токен доступа.

{
  "resource": "https://api.example.com",
  "authorization_servers": [
    "https://auth.example.com"
  ],
  "scopes_supported": ["read", "write"],
  "bearer_methods_supported": ["header"]
}

Зачем нужен OAuth Protected Resource?

Когда AI-агент обращается к API и получает 401 Unauthorized, он должен самостоятельно найти Authorization Server. RFC 9728 стандартизирует этот discovery-шаг двумя способами:

  1. Сервер возвращает заголовок WWW-Authenticate: Bearer as_uri="https://auth.example.com".
  2. Агент проверяет /.well-known/oauth-protected-resource напрямую.

Без этого документа агент не может автономно пройти авторизацию — ему требуется ручная настройка. Спецификация MCP требует поддержки RFC 9728 для MCP-серверов с OAuth.

Как реализовать OAuth Protected Resource?

Опубликуйте статический JSON-файл с Content-Type application/json по пути /.well-known/oauth-protected-resource. Обязательные поля:

ПолеТипОписание
resourcestring (URI)URI самого защищённого ресурса
authorization_serversarrayСписок URL Authorization Server’ов
scopes_supportedarrayПоддерживаемые OAuth-скоупы
bearer_methods_supportedarrayМетоды передачи токена (header, body, query)

Полный discovery-флоу для MCP-сервера с авторизацией:

GET /.well-known/oauth-protected-resource
→ { "authorization_servers": ["https://auth.example.com"], ... }

GET https://auth.example.com/.well-known/oauth-authorization-server
→ { "token_endpoint": "...", "authorization_endpoint": "..." }

POST .../token  →  access_token
GET /api/resource  (Authorization: Bearer <token>)

Как мы проверяем OAuth Protected Resource?

Сканер выполняет GET-запрос на /.well-known/oauth-protected-resource и проверяет:

  • HTTP-статус 200 и валидный JSON
  • Наличие обязательных полей: resource, authorization_servers, scopes_supported
  • Не пустой массив authorization_servers

Если хотя бы одно из условий нарушено — проверка oauth_protected_resource возвращает fail. Сама авторизация по полученному токену не выполняется.

Источники и спецификации