Перейти к основному содержимому

Аутентификация

Перед тем как что-то менять

Страницы безопасности описывают границы, которые защищают общие системы и данные пользователей. Убедись, что понимаешь границу, которую собираешься изменить, прежде чем тестировать или модифицировать что-либо.

Crawbl поддерживает два пути аутентификации, и они взаимно исключают друг друга для каждого запроса.

Простыми словами, эта страница отвечает на два вопроса:

  1. как запрос доказывает, кто является пользователем?
  2. какой слой отклоняет запрос, если это доказательство неверно?

Понимание того, какой путь применяется и где происходит валидация, необходимо для отладки проблем с аутентификацией и добавления новых клиентов.

Два пути аутентификации

Authentication Flow
Click diagram to zoom

HMAC (мобильное приложение)

Это основной путь для Flutter-мобильного приложения. Клиент отправляет Firebase ID-токен в X-Token плюс HMAC-заголовки, привязанные к устройству, при каждом запросе.

Это можно понять как двухэтапную проверку:

  • токен говорит, кто является пользователем
  • HMAC-заголовки доказывают, что запрос пришёл от клиента, который знает общий секрет подписи
1
Step 1

Send the mobile headers

Приложение отправляет X-Token, X-Timestamp, X-Signature, X-Device-Info и X-Version.

2
Step 2

Validate the HMAC

На границе Envoy WASM-фильтр проверяет, что временная метка свежая и HMAC-подпись совпадает.

3
Step 3

Validate the Firebase token

SecurityPolicy Envoy валидирует Firebase JWT из того же заголовка X-Token.

4
Step 4

Forward trusted identity

Если обе проверки проходят, Envoy пересылает доверенные заголовки X-Firebase-* в оркестратор.

5
Step 5

Resolve the user

Оркестратор читает эти доверенные заголовки и ищет запись пользователя.

Когда использовать: мобильные клиенты и любой клиент, который может безопасно хранить Firebase-токен и вычислять HMAC-SHA256-подписи.

JWT (стандартные клиенты)

Этот путь использует стандартный Firebase ID-токен в заголовке Authorization.

Это более простой путь. Именно его должны использовать большинство бэкенд-инструментов, скриптов или немобильных клиентов.

1
Step 1

Send a bearer token

Клиент отправляет Authorization: Bearer <firebase-id-token>.

2
Step 2

Validate it at the edge

SecurityPolicy Envoy валидирует токен через JWKS-эндпоинт Firebase.

3
Step 3

Forward the decoded identity

Если токен действителен, Envoy пересылает доверенные заголовки X-Firebase-*.

4
Step 4

Attach the principal

Оркестратор читает эти заголовки и преобразует их в принципал запроса, используемый кодом бэкенда.

Когда использовать: веб-дашборды, межсервисные вызовы, CLI-инструменты и другие клиенты, которые уже используют стандартные Bearer-токены.

Взаимная исключительность

Один запрос использует один из путей, но не оба одновременно. WASM-фильтр проверяет наличие заголовка X-Token:

  • Если X-Token присутствует, фильтр применяет валидацию HMAC, а JWT валидируется из X-Token
  • Если X-Token отсутствует, запрос следует стандартному пути Authorization: Bearer

Это означает, что никакой неоднозначности в том, какой путь применяется, нет.

Где происходит валидация

ПроверкаГдеЧто происходит при ошибке
HMAC-подписьWASM-фильтр Envoy (граница)401/403 до достижения бэкенда
Firebase JWT в X-Token или AuthorizationSecurityPolicy Envoy (граница)401 до достижения бэкенда
Извлечение заголовков идентификацииMiddleware оркестратора401 от бэкенда

Ключевой момент: оба пути отклоняют невалидные запросы на границе. В продакшене оркестратор никогда не видит неаутентифицированный трафик. Middleware бэкенда только читает доверенные заголовки, пересланные Envoy.

Добавление нового клиента

Если ты создаёшь нового клиента, выбери путь аутентификации исходя из того, какие заголовки он может отправлять:

  • Мобилеподобные клиенты, которые могут вычислять HMAC и отправлять X-Token, должны использовать путь HMAC
  • Стандартные клиенты, которые уже используют Bearer-токены, должны использовать путь JWT

Оба пути приводят к одному и тому же middleware оркестратора, который прикрепляет Principal к контексту запроса. Дальше код работает одинаково, независимо от того, как пользователь аутентифицировался.

В будущем: поток интеграции OAuth

Когда появятся подключения к сторонним приложениям (Gmail, Slack, Calendar), OAuth будет работать так:

OAuth Integration Flow
Click diagram to zoom

Ключевые проектные решения:

  • Мобильный клиент использует flutter_appauth для OAuth-потока с PKCE
  • Токены хранятся на стороне сервера; агенты не получают «сырые» учётные данные провайдера
  • MCP-инструменты вызывают внешние API, используя сохранённые токены от имени пользователя
  • Планируемые провайдеры: Slack, Gmail, Calendar, Jira, Asana, Notion, Zoom и GitHub

Что дальше

Валидация подписи устройства на границе обрабатывается выделенным фильтром авторизации, который работает на уровне ingress.