web_api_tokens v0.3.1 [base]


API-токены веб-панели, одноразовые ticket для WebSocket и TG-команды привязки (владелец привязок — access).

README

# web_api_tokens

API-токены веб-панели и одноразовые пропуска для живого канала.

Тип: Модуль. Категория: `base`. Зависимостей нет.

## Описание

Токены — это пароль для скриптов и автоматики: предъявляются заголовком вместо логина в браузере. Каждый токен выпускается с ограниченной областью — подмножеством прав владельца. Выдать прав больше, чем есть у самого владельца, нельзя. Сам секрет показывается один раз при выпуске, дальше хранится только его хеш.

Для живого канала связи долгий токен в адресе светить запрещено: клиент меняет его на одноразовый пропуск, который сгорает при первом же подключении.

У пользователей Telegram нет аккаунта кабинета, поэтому токены им привязать не к чему. Для этого есть привязка: в кабинете выпускается одноразовый код с коротким сроком жизни, в боте он вводится командой — и Telegram-id связывается с учётной записью. После этого токены выпускаются прямо из бота. Разорвать связь можно с любой стороны. Владелец привязок — модуль access (здесь только TG-команды и прокси API); поддерживаются множественные TG на один web-uid и обратный вектор — код из бота `/bind` вводится в кабинете.

## Возможности

- `lookup {token: str}` → проверить Bearer-токен (идентификация запроса транспортом)
- `create {uid: int, username: str, name: str, scope: list|None, created_by: int}` → выпустить API-токен (секрет — только здесь и сейчас)
- `list {uid: int}` → токены пользователя (без секретов)
- `revoke {uid: int, token_id: str}` → отозвать один токен
- `mint_ticket {uid: int, username: str, scope: list|None}` → одноразовый ticket для WebSocket
- `consume_ticket {ticket: str}` → погасить ticket при открытии WS (одноразово)
- `link_code {uid: int}` → одноразовый код привязки TG (10 мин, из веб-кабинета)
- `link_consume {code: str, telegram_qid: str}` → погасить код из `/link` (привязать TG к web-uid)
- `linked_uid {telegram_qid: str}` → web-uid, привязанный к TG
- `linked_telegram {uid: int}` → первый TG-qid web-uid (legacy)
- `linked_telegrams {uid: int}` → все qid web-uid (множественные)
- `canonical_owner {qid: str}` → канонический владелец пользовательских данных (общий/раздельный)
- `link_tg_code {qid: str}` → код привязки tg->web (из `/bind` в боте)
- `link_tg_consume {code: str, uid: int}` → погасить tg-код в кабинете
- `link_set_inherit {qid: str, flag: bool}` → согласие на наследование web-прав в TG (union)
- `link_list {}` → все привязки (для админки)
- `link_admin {uid: int, qid: str}` → админская связка пары (минуя коды)
- `unlink {telegram_qid: str}` → снять привязку TG
- `unlink_uid {uid: int}` → снять все привязки пользователя
- `effective_can {qid: str, right: str}` → право TG-qid с учётом привязки (union; all не наследуется)
- `magic_issue {uid: int, qid: str}` → ticket волшебного входа (из привязанной лички ТГ)
- `magic_consume {ticket: str}` → погасить ticket волшебного входа (одноразово)

## Права

- `tokens_tg` — API-токены через Telegram (/token, /tokens, /token_del) — только явным списком
- использует чужое `manage_rights` — `/binds`, `/bind <uid> <id>`, `/unlink <qid>` (админские перегрузки)

## Telegram

- `/link <код>` — привязать TG к web-аккаунту (код из веб-кабинета; без права, только личка)
- `/unlink` — отвязать (без права)
- `/bind` — выпустить код для ввода в кабинете (обратный вектор; без права, только личка)
- `/weblogin` — ссылка волшебного входа в кабинет (только привязанные, только личка, флаг MAGIC_LOGIN)
- `/token [имя]` — выпустить токен (показывается один раз)
- `/tokens` — список своих токенов
- `/token_del <id>` — отозвать токен

## Web

- `POST /api/auth/token` — выпустить токен
- `GET /api/auth/tokens` — список своих токенов
- `POST /api/auth/token/revoke` — отозвать токен
- `POST /api/auth/ticket` — ticket для WebSocket
- `POST /api/auth/link_code` — код привязки TG
- `GET /api/auth/link` — кто привязан (список)
- `POST /api/auth/unlink` — отвязать (себя или конкретный qid)
- `POST /api/auth/link_tg_consume` — погасить код из `/bind`
- `POST /api/auth/link_inherit` — согласие на наследование прав в TG
- `GET /api/auth/magic` — вход по ticket волшебной ссылки (создаёт cookie-сессию)

## Конфигурация (`config.schema.json`)

- Опциональные: `API_TOKENS_FILE` = ``, `TG_LINKS_FILE` = `` (legacy), `MAGIC_BASE_URL` = `` (база для волшебной ссылки; пусто — из Host-заголовка)

Манифест

{
  "name": "web_api_tokens",
  "version": "0.3.1",
  "category": "base",
  "description": "API-токены веб-панели, одноразовые ticket для WebSocket и TG-команды привязки (владелец привязок — access).",
  "requires": [],
  "rights": [],
  "api_methods": [],
  "web_routes": [],
  "commit": "7c17fbe1539928163b0b7a7be0f6e2005f699dcd",
  "updated": "2026-10-07 23:19:08 +0300",
  "history": [
    {
      "version": "0.1.0",
      "date": "2026-09-08 09:46:42 +0300",
      "commit": "5c758d465ca4dd3e1541909f2b685dc5c5424246"
    },
    {
      "version": "0.2.0",
      "date": "2026-09-11 10:14:23 +0300",
      "commit": "86ca69448ecf0c529c97ee1215747a8eb33dcc48"
    },
    {
      "version": "0.2.1",
      "date": "2026-09-12 23:22:16 +0300",
      "commit": "db9c47f797b3a96a29b646f86025a87d1eb4d645"
    },
    {
      "version": "0.3.0",
      "date": "2026-10-07 22:46:22 +0300",
      "commit": "30231374bb58d56272c7cdc2261989af7146d3a9"
    },
    {
      "version": "0.3.1",
      "date": "2026-10-07 23:19:08 +0300",
      "commit": "7c17fbe1539928163b0b7a7be0f6e2005f699dcd"
    }
  ],
  "integrity": "sha256:9444db0471b4c18bfcf7028a8febc9c2599e338b9bbcc00c9ba462cc3f98cfe0",
  "files": "[9 файлов — см. вкладки ниже]",
  "note": "",
  "wdesc": "",
  "wbody": "",
  "_extra": {
    "api": "",
    "tg_commands": "",
    "events_emitted": "[]",
    "events_subscribed": "[]",
    "uses_rights": "",
    "audit_allow": "",
    "shared_routes": "",
    "config_schema": "config.schema.json",
    "env_example": ".env.example"
  }
}

Файлы и исходники

Дерево файлов

  • · корень
    • 6.3 КБ
    • 0.1 КБ
    • 19.5 КБ
    • 6.3 КБ
    • 3.0 КБ
    • 10.9 КБ
    • 8.5 КБ
  • web/
    • 3.4 КБ
    • 10.5 КБ

Предпросмотр

Выберите файл в дереве выше — код откроется здесь.

История версий

versiondatecommit
0.3.12026-10-077c17fbe15399
0.3.02026-10-0730231374bb58
0.2.12026-09-12db9c47f797b3
0.2.02026-09-1186ca69448ecf
0.1.02026-09-085c758d465ca4