Управление токенами — документация amocrm-sdk 0.1.0

# Управление токенами

AmoCRM выдаёт два токена при OAuth-авторизации:

- access_token — срок жизни 24 часа.

- refresh_token — срок жизни 3 месяца; обновляется при каждом refresh.

## Реактивное обновление по 401

Это базовое поведение SDK: если API вернул `401 Unauthorized`, клиент автоматически вызывает `_refresh_tokens()` и повторяет исходный запрос один раз.

## Проактивное обновление по истечению срока

При каждом запросе клиент проверяет, не истёк ли (или не истекает ли в ближайшие 60 секунд) access_token. Если да — refresh выполняется до отправки запроса, без лишнего 401-цикла.

Срок жизни токена определяется так:

1. При инициализации клиента из JWT-payload access_token — поле `exp` декодируется без проверки подписи.

2. После каждого refresh — из поля `expires_in` в ответе AmoCRM API (fallback: 86 400 с / 24 ч).

    _request() вызван
        │
        ├─ expires_at known AND now ≥ expires_at − 60s → _refresh_tokens()
        │
        └─ session.request(...)
                │
                ├─ 401 → _refresh_tokens() → повтор запроса
                └─ OK  → вернуть ответ

## Хранилище токенов

Интерфейс `TokenStorage` остался неизменным — `save(access_token, refresh_token)` и `load() → tuple[str, str]`. Время истечения хранится только в памяти клиента и восстанавливается из JWT при каждом создании нового экземпляра `AmoCRM`.

Встроенные реализации хранилища:

Класс | Описание
--- | ---
`InMemoryTokenStorage` | Хранит токены в атрибутах объекта. Подходит для скриптов и тестов.
`DjangoTokenStorage` | Хранит токены в полях модели Django и вызывает `instance.save()`.