API-ключи для serverless-функций: авторизация на шлюзе без boilerplate
Шлюз Inquir проверяет API-ключ до запуска хендлера. Функция получает только аутентифицированные запросы — без <code>if (!apiKey) return 401</code> в каждом обработчике.
Обновлено: 2026-06-28
Кратко
Суть ответа
API-ключи для serverless-функций: авторизация на шлюзе без boilerplate. API-ключ задаётся в конфигурации маршрута. Шлюз проверяет заголовок X-Api-Key до запуска хендлера (для authType api-key), и функция видит только прошедшие проверку запросы.
Когда подходит и когда нет
- Эндпоинты инструментов ИИ, вебхуки и внутренние API без публичного доступа
- Вызовы «машина–машина»: без пользовательских сессий, только Bearer-токен
- Internal function-to-function calls where you want auth without handler boilerplate
На что обратить внимание
- Публичные эндпоинты без авторизации — шлюз просто не включает проверку ключа.
- Если нужна сложная авторизация на уровне данных (row-level security, RBAC по ролям пользователя), проверка на шлюзе дополняет, а не заменяет логику в хендлере.
Ситуация: нагрузка и где обычно ломается
Почему проверять авторизацию в каждой функции — плохо
- 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 сравнении открывает эндпоинт наружу.
Компромиссы
Когда проверка на шлюзе не нужна
Публичные эндпоинты без авторизации — шлюз просто не включает проверку ключа.
Если нужна сложная авторизация на уровне данных (row-level security, RBAC по ролям пользователя), проверка на шлюзе дополняет, а не заменяет логику в хендлере.
Как Inquir помогает в этом сценарии
Авторизация на уровне шлюза
API-ключ задаётся в конфигурации маршрута. Шлюз проверяет заголовок X-Api-Key до запуска хендлера (для authType api-key), и функция видит только прошедшие проверку запросы.
Ротация ключа выполняется в UI рабочего пространства — хендлер не меняется и редеплой не нужен.
Что вы получаете на платформе
Что даёт проверка API-ключей на шлюзе
Auth до хендлера
Неаутентифицированный запрос отбивается шлюзом с 401 — функция не запускается и не расходует ресурсы.
Ротация без редеплоя
Новый ключ создаётся в UI, старый отзывается — код функции не меняется.
Ключи в разрезе маршрутов
Разные ключи для разных маршрутов: эндпоинт инструмента ИИ — один ключ, внутренний 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 checked X-Api-Key before invoke 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 }) }; }
Когда подходит и когда нет
Когда нужна авторизация на шлюзе
Когда это уместно
- Эндпоинты инструментов ИИ, вебхуки и внутренние API без публичного доступа
- Вызовы «машина–машина»: без пользовательских сессий, только Bearer-токен
- Internal function-to-function calls where you want auth without handler boilerplate
Когда лучше выбрать другое
- Публичные эндпоинты без авторизации
Вопросы и ответы
Вопросы и ответы
Как передать ключ в запросе?
Для маршрутов с authType api-key — заголовок X-Api-Key. Для bearer-маршрутов — Authorization: Bearer <session token>.
Поддерживается несколько ключей для одного маршрута?
Да. К маршруту можно привязать несколько ключей для разных клиентов с независимой ротацией.
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.