s-authkit-contracts — общий язык доступа
Форма X-API-Key, скоупы семейство:*, окно допуска TOTP-кода, статус
сессии-владения и канонический in-memory стенд для тестов — то, что должно
пониматься ОДИНАКОВО по обе стороны любой границы между authkit-server,
authkit-client, leasekit и sessionkit. Ноль зависимостей — только stdlib.
Зачем этот кит
До него форма X-API-Key существовала в трёх несовместимых видах в разных
репозиториях портфеля (authkit-server: ak_<key_id>_<secret> + sha256 секрета
с O(1)-поиском по key_id; atlas-backend: голый token_urlsafe(32) без
префикса, поиск линейным перебором; skillery-backend webhook: HMAC-подпись
тела с отдельным заголовком X-Skillery-Key-Id), а has_scope и константа
шага TOTP были продублированы независимо внутри одного и того же кита. Этот
кит фиксирует форму authkit-server (боевую, уже параметризованную заголовком
в servicekit) как контракт — единственный, который остальные обязаны понимать
одинаково — без переиздания сервисной логики.
Чем владеет
authkit_contracts.apikey—HEADER,PREFIX,HASH_ALGO,PresentedKey,parse_presented/format_presented,hash_secret, структурныйApiKeyRecord(Protocol).authkit_contracts.scopes—has_scope(granted, required).authkit_contracts.totp_window—STEP_SECONDS,DEFAULT_VALID_WINDOW,valid_counters().authkit_contracts.status—Status(live/expired/blocked/logged_out),is_usable().authkit_contracts.testing—InMemoryApiKeyStore,issued_key().
Чем НЕ владеет
- Сервисной логикой ключей (issue/verify/revoke, реальный store) — она
остаётся в authkit-server, который знает про
subject,expires_at,labelи конкретную базу данных. - HTTP-проводкой (FastAPI dependency, middleware) — она в servicekit.
- Генерацией и проверкой TOTP-кода (pyotp, base32-секрет) — генерация в totpkit (чужие сервисы: PyPI/Bitrix/GitHub), проверка в authkit-server (свой второй фактор). Здесь только число шага и формула допуска.
- Здоровьем аккаунта во всей полноте.
Status— одна ось (владение сессией прямо сейчас), а не слияниеHealthState/SsoState/AccountAuthState/AccountState/AccessState/LeaseVerdict— они отвечают на разные вопросы и намеренно не сведены в один enum.
Установка
pip install s-authkit-contracts
Импортируется как authkit_contracts. Требуется Python 3.11+.
Быстрый старт
from authkit_contracts import (
format_presented, parse_presented, hash_secret,
has_scope, Status, is_usable, InMemoryApiKeyStore, issued_key,
)
# Собрать и разобрать предъявляемую строку.
presented = format_presented("a1b2c3", "секрет")
parsed = parse_presented(presented) # PresentedKey(key_id='a1b2c3', secret='секрет')
hash_secret(parsed.secret) # версионированный sha256
# Скоупы: семейство:* покрывает любое право семейства.
has_scope(["posts:*"], "posts:read") # True
has_scope(["posts:read"], "posts:write") # False
# Статус сессии-владения.
is_usable(Status.LIVE) # True
is_usable(Status.EXPIRED) # False
# Тестовый стенд.
store = InMemoryApiKeyStore()
plaintext = issued_key(store, "totp:read") # готовая строка для X-API-Key
Разработка
uv sync
uv run pytest -q
uv run ruff check .
uv run --with import-linter lint-imports
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file s_authkit_contracts-0.1.0.tar.gz.
File metadata
- Download URL: s_authkit_contracts-0.1.0.tar.gz
- Upload date:
- Size: 23.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2980c8722a0e829f6bbb33d1971e89232e44ad4b6cf84731388d4191a5611ef
|
|
| MD5 |
448f74dd060d85a5f3bb0c07ea48d317
|
|
| BLAKE2b-256 |
f0be4d881243e7752302b02e4b4ca243f093e482c8f15a725cd9b3eab0f28a47
|
File details
Details for the file s_authkit_contracts-0.1.0-py3-none-any.whl.
File metadata
- Download URL: s_authkit_contracts-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e247e557066cc7587a8e40f21d4b1362a5ff564296b7226986c566206cc9f1d
|
|
| MD5 |
200bd77afa90283783cda0e294998872
|
|
| BLAKE2b-256 |
7807d058ec53173bb0a63f7cca1fcd079ac0ea322313998b58228c9b7d5e627e
|