Skip to main content

totp-client — одноразовые коды (TOTP) для любых сервисов

Одно шифрованное хранилище вторых факторов на все сервисы: PyPI, GitHub, Bitrix24, что угодно. Другие проекты берут коды из того же стора одной строкой, не заводя собственных копий секретов.

Это клиент, и только клиент: библиотека плюс CLI. Фронтендов он не содержит — Telegram-бот выдачи кодов живёт отдельным проектом totp-bot, серверная часть с общим стором и журналом выдач — totp-service. Граница проведена намеренно: клиент ставится в окружение каждого навыка, которому нужен код, и тащить туда aiogram с обработчиками чужого интерфейса — плохая сделка.

Установка

uv add s-totp-client        # как зависимость
uv run python scripts/self_check.py

Быстрый старт

totp entry add --uri "otpauth://totp/PyPI:alice?secret=…&issuer=PyPI"
totp list
totp code pypi              # {"code": "366845", "seconds_left": 20}

Вывод — JSON по умолчанию; --text переключает на человекочитаемый.

Из своего кода

from totp_client import provider_for

login(username, password, totp_provider=provider_for("pypi"))

Провайдер отдаёт код по сигнатуре (попытка, прошлая ошибка) -> код и сам разбирается с границей 30-секундного окна: ждёт ротацию, когда коду осталось жить меньше трёх секунд, и никогда не отдаёт дважды один и тот же код — иначе повторная попытка входа сгорает на коде, который сервис уже отверг.

Модель хранения

Запись — это сервис + аккаунт + иконка + группа. Ключ строится как сервис или сервис:аккаунт и служит тем, что вы набираете руками: пока аккаунт один, работает короткое totp code pypi; когда их стало два, короткая форма даёт ошибку со списком вариантов, а не выдаёт код наугад.

Групп по умолчанию нет — всё лежит одним плоским списком, пока группу не задали.

Секреты пишутся в системное хранилище (keyring). Если рабочего бэкенда нет, кит честно предупреждает и уходит в файл — проверить можно командой totp store status. Длинные сторы режутся на куски: у Windows Credential Manager есть жёсткий потолок на размер значения, и без нарезки хранилище молча деградировало бы в открытый файл ровно тогда, когда записей стало много.

Коды на телефоне

Кнопка в Telegram — это отдельный проект totp-bot: он ставит себе этот клиент зависимостью и берёт коды тем же provider_for. Здесь про него только одно: иконку сервиса и подписи кнопок в любом фронтенде задаёт провайдер — плагин навыка, объявленный entry-point'ом totpkit.providers (имя группы осталось прежним после переименования пакета, чтобы уже написанные плагины продолжали находиться). Провайдер отдаёт готовые строки и ничего не знает ни про Telegram, ни про aiogram — потому и живёт в клиенте, а не во фронтенде.

Лицензия

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

s_totp_client-0.3.0.tar.gz (83.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

s_totp_client-0.3.0-py3-none-any.whl (34.2 kB view details)

Uploaded Python 3

File details

Details for the file s_totp_client-0.3.0.tar.gz.

File metadata

  • Download URL: s_totp_client-0.3.0.tar.gz
  • Upload date:
  • Size: 83.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for s_totp_client-0.3.0.tar.gz
Algorithm Hash digest
SHA256 5a5648447348584939867de19c8f57451caaa5f6adbdd27cb82f2dc648a8371c
MD5 8462d1e20037a1d32226434e91360bb0
BLAKE2b-256 c476bf136b69590048c229d49c1772728366a466a84663ee9b2bb8a39a3b905e

See more details on using hashes here.

File details

Details for the file s_totp_client-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: s_totp_client-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 34.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for s_totp_client-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1dbdfcb1b15fb0b3c32134cff6a1e528386c8a1e8fe9ec10e88e0b384995b68c
MD5 5496a3aa9a9c1ad8f66d8c7f97e8fa95
BLAKE2b-256 a183a23c287357fac28acacfbea2a697a0b70e8acb4d5b606710b785cbe55474

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page