Безопасность · Inquir Compute

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 по ролям пользователя), проверка на шлюзе дополняет, а не заменяет логику в хендлере.

Авторизация на уровне шлюза

API-ключ задаётся в конфигурации маршрута. Шлюз проверяет заголовок X-Api-Key до запуска хендлера (для authType api-key), и функция видит только прошедшие проверку запросы.

Ротация ключа выполняется в UI рабочего пространства — хендлер не меняется и редеплой не нужен.

Что даёт проверка API-ключей на шлюзе

Auth до хендлера

Неаутентифицированный запрос отбивается шлюзом с 401 — функция не запускается и не расходует ресурсы.

Ротация без редеплоя

Новый ключ создаётся в UI, старый отзывается — код функции не меняется.

Ключи в разрезе маршрутов

Разные ключи для разных маршрутов: эндпоинт инструмента ИИ — один ключ, внутренний cron-триггер — другой.

Никакого boilerplate

Никакого if (!validateKey(req)) return 401 в коде — хендлер сфокусирован на бизнес-логике.

Как настроить API-ключ

1

Создать ключ в рабочем пространстве

Сгенерируйте ключ через UI и передайте его клиенту или в env-переменную вызывающего сервиса.

2

Привязать к маршруту

В настройках маршрута выберите требуемый ключ — шлюз начнёт проверку немедленно.

3

Ротировать по необходимости

Новый ключ в 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.

api/customer-data.mjs (auth handled by gateway)
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 }) };
}
tools/internal-lookup.mjs (called by AI agent with scoped key)
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.