Перейти к содержанию
Версия контракта: 0.3.3 — спека

Ключи и режимы

Страница для интегратора: как устроен ключ, что он может и почему тестовые данные не видны боевым ключом.

Формат

nbh_<режим>_<12 символов открытой части>_<32 символа секрета>

Открытая часть не секрет: по ней хаб находит запись ключа, не зная самого секрета. Секрет хранится только хешем (Argon2id) — восстановить его нельзя ни из базы, ни через поддержку.

Значение показывается один раз, при выпуске. Забытый ключ отзывается и выпускается заново; «покажите ещё раз» технически невозможно.

Режимы

nbh_test_… — песочница, nbh_live_… — бой. Это один и тот же API и один и тот же аккаунт; разделены только данные и исход отправки.

Изоляция строгая в обе стороны: объект другого режима отвечает 404 not_found — тем же ответом, что и несуществующий. Иначе тестовым ключом можно было бы перебором узнать, что существует в бою.

Режим ключа и режим объекта не смешиваются: ключ, чей режим разошёлся с записью, не работает вовсе.

Права

У ключа набор прав; лишних лучше не давать:

Право Что открывает
send отправка сообщений и пакетов
read чтение сообщений, событий, пакетов, аккаунта
templates:write заведение и правка шаблонов
webhooks:write управление подписками на вебхуки

Запрос без нужного права — 403 insufficient_scope. Отдельного административного права у публичного API нет и не будет: административные действия живут во внутреннем контуре, куда ключом тенанта хода нет.

Ограничение по адресу

У ключа может быть список разрешённых адресов. Запрос с другого — отказ, даже если ключ верный. Список задаёт оператор хаба по вашей просьбе; для серверной интеграции с постоянными адресами это дешёвая защита от утёкшего ключа.

Хранение и утечка

  • ключ — в переменной окружения или менеджере секретов, не в репозитории;
  • в логи не пишется: хаб маскирует его в своих, вы — в своих;
  • утёк — отзывайте немедленно. Отзыв действует со следующего запроса: ключ не кешируется на стороне хаба.

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

Что делать при 401

401 invalid_api_key означает одно из: ключа нет, он отозван, секрет не совпал, режим ключа разошёлся с записью. Какое именно — ответ не говорит намеренно: подбирающий не должен узнать по ответу, что подобрался ближе.

Слишком много неудачных попыток подряд с одного адреса — 429: вход ограничивает подбор. Обычной интеграции это не касается.