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

API-ключи для serverless-функций: авторизация на шлюзе без boilerplate

Шлюз Inquir проверяет API-ключ до запуска хендлера. Функция получает только аутентифицированные запросы — без `if (!apiKey) return 401` в каждом обработчике.

Last updated: 2026-04-20

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

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

API-ключ задаётся в конфигурации маршрута. Шлюз проверяет заголовок `Authorization: Bearer <key>` до запуска хендлера. Функция видит только прошедшие проверку запросы.

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

Что даёт gateway-level API key auth

Auth до хендлера

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

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

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

Скоупинг по маршруту

Разные ключи для разных маршрутов: AI tool endpoint — один ключ, внутренний 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 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 }) };
}
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 }) };
}

Когда нужна gateway auth

Когда это уместно

  • AI tool endpoints, вебхуки, внутренние API без публичного доступа
  • Машина-машина: нет сессий пользователя, только Bearer-токен
  • Internal function-to-function calls where you want auth without handler boilerplate

Когда лучше не трогать

  • Публичные эндпоинты без авторизации

Вопросы и ответы

Как передать ключ в запросе?

Заголовок `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.

Inquir Compute logoInquir Compute

Самый простой способ запускать AI-агентов и backend-джобы без инфраструктуры.

Связаться info@inquir.org

© 2025 Inquir Compute. Все права защищены.