API-ключи для serverless-функций: авторизация на шлюзе без boilerplate
Шлюз Inquir проверяет API-ключ до запуска хендлера. Функция получает только аутентифицированные запросы — без `if (!apiKey) return 401` в каждом обработчике.
Last updated: 2026-04-20
Answer first
Direct answer
API-ключи для serverless-функций: авторизация на шлюзе без boilerplate. API-ключ задаётся в конфигурации маршрута. Шлюз проверяет заголовок `Authorization: Bearer <key>` до запуска хендлера. Функция видит только прошедшие проверку запросы.
When it fits
- AI tool endpoints, вебхуки, внутренние API без публичного доступа
- Машина-машина: нет сессий пользователя, только Bearer-токен
- Internal function-to-function calls where you want auth without handler boilerplate
Tradeoffs
- Публичные эндпоинты без авторизации — шлюз просто не ставит проверку ключа.
- Если нужна сложная авторизация на уровне данных (row-level security, RBAC по ролям пользователя) — gateway auth дополняет, не заменяет логику в хендлере.
Нагрузка и где ломается
Почему auth-boilerplate в каждой функции — плохо
- Auth middleware in every function handler: duplicated logic, easy to forget on new routes
- Accidental open endpoints: deploy a function without adding auth middleware and it is publicly accessible
- Key rotation requires code changes: if the key is checked inside the handler, rotating it requires a redeploy
- No per-route scoping: one shared API key for all functions means rotation affects every caller simultaneously
Если каждая функция проверяет ключ сама — логика авторизации дублируется. Одна опечатка в timing-safe сравнении открывает эндпоинт.
Компромиссы
Когда gateway auth не нужен
Публичные эндпоинты без авторизации — шлюз просто не ставит проверку ключа.
Если нужна сложная авторизация на уровне данных (row-level security, RBAC по ролям пользователя) — gateway auth дополняет, не заменяет логику в хендлере.
Как помогает Inquir
Авторизация на уровне шлюза
API-ключ задаётся в конфигурации маршрута. Шлюз проверяет заголовок `Authorization: Bearer <key>` до запуска хендлера. Функция видит только прошедшие проверку запросы.
Ротация ключа — в UI рабочего пространства; хендлер не меняется и не требует редеплоя.
Что получаете
Что даёт gateway-level API key auth
Auth до хендлера
Неаутентифицированный запрос отбивается шлюзом с 401 — функция не запускается и не расходует ресурсы.
Ротация без редеплоя
Новый ключ в UI → старый ключ отзывается. Код функции не меняется.
Скоупинг по маршруту
Разные ключи для разных маршрутов: AI tool endpoint — один ключ, внутренний cron-триггер — другой.
Нет boilerplate
Никакого `if (!validateKey(req)) return 401` в коде. Хендлер сфокусирован на бизнес-логике.
Что делать дальше
Как настроить API-ключ
Создать ключ в рабочем пространстве
Сгенерировать ключ через UI; скопировать для передачи клиенту или в env-переменную вызывающего сервиса.
Привязать к маршруту
В настройках маршрута выбрать требуемый ключ. Шлюз начнёт проверку немедленно.
Ротировать по необходимости
Новый ключ в UI — старый деактивирован. Хендлер не трогается.
Пример кода
Handler code with gateway-level auth (no auth boilerplate)
The gateway validates the API key before this code runs. The handler can assume the caller is authenticated and focus entirely on business logic.
export async function handler(event) { // No API key validation needed — gateway already enforced auth // event.requestContext.identity.apiKeyId is available if you need key metadata const customerId = event.pathParameters?.customerId; if (!customerId) return { statusCode: 400, body: JSON.stringify({ error: 'customerId required' }) }; const customer = await db.customers.findById(customerId); if (!customer) return { statusCode: 404, body: JSON.stringify({ error: 'not found' }) }; return { statusCode: 200, body: JSON.stringify({ customer }) }; }
export async function handler(event) { // This route uses a different API key than the public routes // The key is scoped to internal tool callers (AI agent orchestrator) const { query } = JSON.parse(event.body || '{}'); const results = await search.query(query); return { statusCode: 200, body: JSON.stringify({ results }) }; }
Когда подходит
Когда нужна gateway auth
Когда это уместно
- AI tool endpoints, вебхуки, внутренние API без публичного доступа
- Машина-машина: нет сессий пользователя, только Bearer-токен
- Internal function-to-function calls where you want auth without handler boilerplate
Когда лучше не трогать
- Публичные эндпоинты без авторизации
FAQ
Вопросы и ответы
Как передать ключ в запросе?
Заголовок `Authorization: Bearer <key>`. Альтернатива — `X-API-Key` — зависит от настройки маршрута.
Поддерживается несколько ключей для одного маршрута?
Да. Можно привязать несколько ключей к маршруту для разных клиентов с независимой ротацией.
How do I rotate a key if it is compromised?
Remove the compromised key from the gateway configuration and add a new one. Existing sessions with the old key fail immediately. Distribute the new key to legitimate callers via your secrets management process.