Static токены
Static-токен — это plaintext bot_<48hex> строка, которую owner получает
при создании бота. Хранится в БД как HMAC-SHA256 keyed-MAC на отдельном
bot_token_secret (изоляция blast-radius от JWT/media-ключей).
Когда использовать
Бот живёт на вашей инфраструктуре, никто другой токен не использует.
Daily-job, slack-bridge, internal tools.
1-click install для пользователей через OAuth2 — в roadmap, пока не реализован. Сейчас бот подключается static-токеном и приглашением в Space.
Токен попадёт в bundle — это leak. Держите static-токен только на сервере; клиентский OAuth + PKCE — в roadmap, пока недоступен.
Использование
В каждом запросе к bot-API:
curl https://api.reasonspace.ru/api/bot/spaces/{id}/voice \
-H "Authorization: Bot bot_8c4f9a1b3d2e7f6a5c9b8d3e7f2a1c4b9e6d2f8a3c1b5e7d"
Verify на сервере (~1µs):
- Extract first 12 chars → lookup row через partial-unique index
- HMAC-SHA256 от всего токена (keyed-MAC на
bot_token_secret), сравнение constant-timehmac.compare_digestсо stored hash
Ротация
При ротации старый token инвалидируется немедленно. Новый plaintext возвращается один раз. Если развёрнуто несколько инстансов со старым токеном — все они потеряют доступ одновременно.
curl -X POST https://api.reasonspace.ru/api/bots/{bot_user_id}/tokens/rotate \
-H "Authorization: Bearer <owner_jwt>"
# Response:
{
"token": "bot_xxxx...", # новый plaintext (ОДИН РАЗ)
"token_prefix": "bot_xxxx" # видимый prefix (для UI/logs)
}
Security
Хранение
Только в env-переменных. .env файлы в .gitignore. Для cloud
deployments — Vault / AWS Secrets Manager / GCP Secret Manager.
Передача
Только HTTPS. Bot SDK добавляет Authorization header автоматически —
не логируйте raw HTTP requests.
Logs
SDK не логирует raw-токен — он передаётся только в заголовке
Authorization. При написании собственного клиента никогда не пишите
полный токен в логи; если нужно отобразить — показывайте только
префикс вида bot_xxxx….
Что делать при утечке
Если токен утёк (попал в публичный репозиторий, лог, скриншот) —
немедленно ротируйте его: POST /api/bots/{bot_user_id}/tokens/rotate.
Старый токен инвалидируется сразу. Автоматического отзыва по
GitHub Secret Scanning платформа пока не выполняет — отслеживайте
утечки на своей стороне. См. Privacy.
Limits
Один active token на бота. При ротации старый сразу revoked. Если
нужно несколько одновременно работающих instances — используйте один static
token и при ротации вручную обновляйте BOT_TOKEN в окружении всех инстансов
с их перезапуском (на 401 SDK бросает BotAPIError — автоматического
восстановления и реакции на ротацию нет). Отдельный access-token на установку
через OAuth — в roadmap, пока не реализован.