Session#

Session из модели#

session_auth(
    SessionModel,
    *,
    credentials=None,
    session=None,
    service,
    store=None,
    identity=None,
    name="session",
    clock=...,
) -> Auth

Передайте credentials= для login или session= для готовой session.

Сессия на куках#

Cookies(required=(), leeway=timedelta(seconds=30), public_suffixes=None)

Identity(auth=(...), cookies=CookieState(...))

StoredCookie(name, value, domain, path="/", host_only=True, expires_at=None,
             secure=False, http_only=False, same_site="")
CookieState(cookies=())

Cookies объявляется на корне или роутере и наследуется как security. Каждый Identity получает свой набор кук; cookies= задаёт начальное состояние. required перечисляет куки, без живого экземпляра которых сессия непригодна, leeway задаёт запас до истечения.

StoredCookie.domain пишется без ведущей точки: область действия задаёт host_only. CookieState.to_primitive() и CookieState.from_primitive(...) переводят снимок в JSON-совместимый вид и обратно.

Аннотации модели#

Bearer()
RefreshToken()
ExpiresAt(leeway=...)

Несколько мест запроса#

Маркер

Размещение

Placed.query(name, secret=True)

параметр query

Placed.header(name, prefix="", secret=True)

заголовок

Bearer() равен Placed.header("Authorization", prefix="Bearer "). Модель несёт не больше одного Bearer. Модель без размещений допустима только на сервисе с Cookies(...). Сессия с пустым размещаемым значением считается непригодной.

Store#

from eazy_sdk.auth.session import MemorySessionStore, SessionStore

MemorySessionStore()

MemorySessionStore и protocol SessionStore живут в eazy_sdk.auth.session; из eazy_sdk.auth они не экспортируются. Совместимый SessionStore получает новую session после login или refresh.

session_auth(...) требует ровно один источник: credentials= для автоматического login или session= для готового значения. Session model должна иметь ровно один Bearer() field, не более одного RefreshToken() и не более одного ExpiresAt().

Store protocol:

await store.load(key) -> StoredSession | None
await store.save(key, value, revision, cookies=None)
await store.invalidate(key, expected=None)

Текущая сессия и куки#

from eazy_sdk.auth import current_session, ensure_session
from eazy_sdk.cookies import cookies_of

session = await ensure_session(sdk)
session = await current_session(sdk)
cookies = cookies_of(sdk)

ensure_session входит, если сессии ещё нет, тем же путём, что и первый защищённый вызов, и своего запроса не шлёт. current_session возвращает сохранённое значение или None. cookies_of отдаёт снимок кук пользователя. Все три принимают корень SDK или роутер; scheme= называет сессию, когда у SDK их несколько.

Revision является CAS proof. Store обязан отклонить сохранение поверх неожиданной более новой revision.