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=...)
Несколько мест запроса#
Маркер |
Размещение |
|---|---|
|
параметр query |
|
заголовок |
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.