--- title: Session description: Публичный API login session. sources: - eazy_sdk.auth api_fingerprint: "sha256:6b0b2a6d74b65c986adfe829a50dc98daf7b4c4ddb4c1a57eb65fcc187329c98" --- ## Session из модели ```python session_auth( SessionModel, *, credentials=None, session=None, service, store=None, identity=None, name="session", clock=..., ) -> Auth ``` Передайте `credentials=` для login или `session=` для готовой session. ## Сессия на куках ```python 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-совместимый вид и обратно. ## Аннотации модели ```python 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 ```python 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: ```python await store.load(key) -> StoredSession | None await store.save(key, value, revision, cookies=None) await store.invalidate(key, expected=None) ``` ## Текущая сессия и куки ```python 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.