Перейти к содержанию

OAuth и токены

SDK прячет OAuth-обмен за AuthProvider, чтобы пользовательский код работал с доменными методами, а не с access token, refresh token и заголовками Authorization.

sequenceDiagram
    participant App as Пользовательский код
    participant Client as AvitoClient
    participant Domain as Домен
    participant Transport as Transport
    participant Auth as AuthProvider
    participant API as Avito API

    App->>Client: AvitoClient.from_env()
    App->>Domain: account().get_self()
    Domain->>Transport: GET /core/v1/accounts/self
    Transport->>Auth: get_access_token()
    Auth-->>Transport: access token
    Transport->>API: request + Authorization
    API-->>Transport: JSON response
    Transport-->>Domain: payload
    Domain-->>App: typed model

Где живёт ответственность

AvitoClient создаёт общий контекст: настройки, auth и transport. Доменный объект выбирает бизнес-операцию. Section client знает HTTP path и payload. Transport добавляет токен и применяет retry. AuthProvider кэширует токен и обновляет его, если upstream отвечает 401.

Такой порядок важен для public contract: публичный метод не принимает access token, не возвращает OAuth-payload и не требует от пользователя повторять refresh-flow.

Ошибка 401

401 считается ошибкой аутентификации, а не авторизации. SDK инвалидирует токен там, где это допустимо, и поднимает AuthenticationError, если запрос не может быть выполнен успешно. 403 остаётся отдельным AuthorizationError: эти типы не наследуются друг от друга.

Autoteka

Часть операций Автотеки использует отдельные OAuth-настройки. Они лежат в AuthSettings рядом с основными credentials, но не смешиваются с публичными методами домена: пользователь вызывает autoteka_vehicle() и autoteka_report(), а выбор token endpoint остаётся внутренним поведением auth-слоя.

Список env-переменных смотрите в reference по конфигурации.