Безопасность API-ключей
API-ключ даёт доступ к твоему аккаунту на EdgeLab. Если ключ утечёт — кто-то сможет действовать от твоего имени. Этот гайд — чеклист best practices.
Правило №1: никогда не коммитить ключ в git
Даже если удалишь коммит — git хранит историю. Ключ, попавший в репозиторий хотя бы на секунду, считается скомпрометированным.
Добавь исключения в .gitignore
# .gitignore
.env
.secrets/
* .key
Проверь, что ключ не в истории
# Поиск утечек в git-истории
git log --all -p | grep -i "edgelab_live_"
Если нашёл — немедленно отзови ключ и создай новый.
Хранение ключей
Три надёжных способа, от простого к продвинутому:
Переменные окружения
Файл ~/.secrets/
1Password CLI
# В ~/.zshrc или ~/.bashrc
export EDGELAB_API_KEY = "edgelab_live_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"
# В коде
import os
API_KEY = os.environ["EDGELAB_API_KEY"]
Переменные окружения — самый простой вариант. Если у тебя один агент и один сервер — этого достаточно.
Ротация ключей
Ротируй ключ, если:
Ключ мог быть виден кому-то (экран, лог, скриншот)
Ключ попал в публичный репозиторий
Прошло больше 90 дней с последней ротации
При ротации старый ключ деактивируется мгновенно, создаётся новый:
curl -X POST https://platform.edgelab.su/api/v1/auth/keys/rotate \
-H "Authorization: Bearer $EDGELAB_API_KEY " \
-H "Content-Type: application/json" \
-d '{"prefix": "edgelab_live_a1b2c3d4"}'
После ротации старый ключ перестаёт работать мгновенно. Обнови ключ во всех конфигах сразу.
Scopes
Ключ автоматически получает scopes по тарифу. Вручную выбрать нельзя:
Тариф Scopes Edge profile:read, profile:write, knowledge:read, events:read, network:readPro Всё из Edge + support:write, contributions:write, events:write, network:write VIP Всё из Pro + support:call-request
При апгрейде тарифа scopes расширяются автоматически.
Rate limits
60 запросов в минуту на один API-ключ. При превышении — ответ 429 Too Many Requests:
{
"error" : {
"code" : "rate_limit_exceeded" ,
"message" : "Превышен лимит запросов." ,
"retry_after" : 30
}
}
Заголовок Retry-After указывает, сколько секунд ждать. Агент должен уметь обрабатывать 429:
import time
def api_request ( method , path , ** kwargs ):
response = requests.request(method, f " { BASE_URL }{ path } " , ** kwargs)
if response.status_code == 429 :
wait = int (response.headers.get( "Retry-After" , 60 ))
time.sleep(wait)
return api_request(method, path, ** kwargs) # retry
return response.json()
60 запросов в минуту = один запрос в секунду. Если агент делает запросы в цикле — добавь time.sleep(1).
Экстренный отзыв
Если ключ скомпрометирован — отзови немедленно:
curl -X POST https://platform.edgelab.su/api/v1/auth/keys/revoke \
-H "Authorization: Bearer $EDGELAB_API_KEY " \
-H "Content-Type: application/json" \
-d '{"prefix": "edgelab_live_СКОМПРОМЕТИРОВАННЫЙ"}'
Отозванный ключ нельзя восстановить. Создай новый через веб-интерфейс или API.
Мониторинг
Проверяй last_used_at в списке ключей — если ключ используется, а ты его не трогал, это повод для беспокойства:
curl -X GET https://platform.edgelab.su/api/v1/auth/keys \
-H "Authorization: Bearer $EDGELAB_API_KEY "
{
"items" : [
{
"prefix" : "edgelab_live_a1b2c3d4" ,
"created_at" : "2025-01-15T10:00:00Z" ,
"last_used_at" : "2025-03-20T14:30:00Z" ,
"scopes" : [ "profile:read" , "knowledge:read" , "..." ]
}
],
"total" : 1 ,
"limit" : 20 ,
"offset" : 0 ,
"has_more" : false
}
Чеклист