Авторизация¶
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.