Skip to content

Авторизация

Sapsan защищает проигрывание и публикацию потоков. Есть два механизма: статические токены в конфиге и внешние auth-бекенды, которым сервер делегирует решение.

Как передается токен

Токен принимается двумя способами (заголовок приоритетнее):

  • заголовок Authorization: Bearer <token>;
  • параметр URL ?token=<token>.

Для HLS достаточно открыть мастер-плейлист с токеном — Sapsan сам допишет ?token= во все вложенные URL (варианты, сегменты, части, init).

Статические токены

auth:
  play_tokens:
  - viewer-secret-1
  publish_tokens:
  - publisher-secret-1
  • play_tokens — токены на проигрывание;
  • publish_tokens — токены на публикацию.

Запрос без валидного токена отклоняется. Если секция auth есть, но ни токены, ни бекенды не подошли — отказ.

Внешние auth-бекенды

Решение можно делегировать HTTP-бекендам:

auth:
  upstreams:
    main:
      url: http://backend.example.com/auth
      timeout_ms: 3000

Sapsan делает POST на url бекенда с JSON-телом:

{
  "kind": "play",                  // play или publish
  "stream_name": "cam1",
  "proto": "hls",                  // протокол: hls, dash, rtsp, m4f, ...
  "user_agent": "Mozilla/5.0 ...", // может отсутствовать
  "token": "viewer-secret-1",      // может отсутствовать
  "session_id": "..."              // стабильный идентификатор сессии
}

Решение принимается по HTTP-статусу ответа (тело не разбирается):

  • 2xx — разрешить;
  • 401 или 403 — запретить (отказ кешируется, повторный идентичный запрос не дергает бекенд);
  • любой другой статус, недоступность или превышение timeout_ms (по умолчанию 1000 мс) — бекенд считается упавшим;
  • несколько бекендов опрашиваются параллельно: достаточно одного «разрешить»; если есть только отказы — запрет; если все бекенды недоступны — ошибка «бекенд недоступен» (не тихий запрет).

Сессии

Сессия зрителя идентифицируется четверкой: поток, тип (play/publish), IP, токен — повторные запросы того же зрителя не плодят новых сессий. Долгоживущие соединения (RTSP, WebRTC) периодически переавторизуются: если бекенд отозвал доступ, сессия закрывается. Счетчики сессий (открытые, отклоненные, авторизованные) доступны в мониторинге.

Доступ к Admin API

Admin API защищается отдельной секцией api_auth — см. Admin API.

Что дальше