Авторизовать проигрывание с помощью токена¶
На сервере доступном в интернете почти сразу необходимо организовывать защиту просмотра, давать просмотр тем пользователям, которым можно и отзывать возможность просмотра у тех, кому больше нельзя. Flussonic, в дополнение к традиционным дорогостоящим системам типа DRM, предлагает недорогую и очень эффективную схему при которой портал, на который заходят зрители, выдает ссылку на проигрывание с включенным уникальным токеном, а сам медиа сервер уже проверяет этот токен.
Эта схема работает в тех случаях, когда контент раздается с медиасервера. Если вы используете CDN, то вам нужно или обращаться к поставщику CDN, или использовать DRM.
Настройка тестового примера¶
Установите триальную версию Flussonic и за несколько минут вы сможете запустить защищенный стрим для тестирования.
http 8080;
rtmp 1935;
rtsp 1554;
auth_backend play-auth {
allow token test1;
}
stream auth-check {
input fake://fake;
on_play auth://play-auth;
}
Как срабатывает защита?¶
Различные проигрыватели и пользовательские устройства по-разному будут показывать, что защищенный видео поток более не доступен для проигрывания. Например ffmpeg покажет следующее:
$ ffmpeg -i rtmp://localhost/rtmp/auth-check
ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
...
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
[in#0 @ 0x600001c9c700] Error opening input: Input/output error
Error opening input file rtmp://localhost/rtmp/auth-check.
Error opening input files: Input/output error
ffmpeg не раскрывает детали отказа, а по http отдается более стандартизованный код ошибки:
$ curl -v http://localhost:8080/auth-check/index.m3u8 -o /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /auth-check/index.m3u8 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/8.1.2
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< access-control-allow-headers: x-vsaas-session, x-no-redirect, origin, authorization, accept, range, content-type, x-add-effective, session, x-originator, x-sid
< access-control-allow-methods: GET, PUT, DELETE, OPTIONS
< access-control-allow-origin: *
< access-control-expose-headers: Server, range, X-Run-Time, X-Sid, Content-Length, Location
< content-length: 1147
< date: Sat, 03 Feb 2024 19:16:16 GMT
< server: Streamer 24.02
< x-deny-reason: backend_denied
< x-route-time: 172
< x-run-time: 210
<
403 отдается, когда авторизация не пустила клиента
Как проиграть с токеном?¶
HTTP¶
По HTTP протоколам: HLS, DASH, MSS, LL-HLS, WebRTC всё довольно просто, токен надо добавить в query string запроса.
$ curl http://localhost:8080/auth-check/index.m3u8?token=test1
#EXTM3U
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=260000,BANDWIDTH=320000,RESOLUTION=320x240,FRAME-RATE=25.000,CODECS="avc1.42c015,mp4a.40.2",CLOSED-CAPTIONS=NONE
tracks-v1a1/mono.m3u8?token=test1
$ ffmpeg -i http://localhost:8080/auth-check/index.m3u8?token=test1
...
[hls @ 0x11f604b70] Opening 'http://localhost:8080/auth-check/tracks-v1a1/mono.m3u8?token=test1' for reading
[hls @ 0x11f604b70] Skip ('#EXT-X-VERSION:3')
[hls @ 0x11f604b70] Skip ('#EXT-X-PROGRAM-DATE-TIME:2024-02-03T19:31:31.839Z')
[hls @ 0x11f604b70] Opening 'http://localhost:8080/auth-check/tracks-v1a1/2024/02/03/19/31/36-05000.ts?token=test1' for reading
[hls @ 0x11f604b70] Opening 'http://localhost:8080/auth-check/tracks-v1a1/2024/02/03/19/31/41-05000.ts?token=test1' for reading
Input #0, hls, from 'http://localhost:8080/auth-check/index.m3u8?token=test1':
Duration: N/A, start: 73249.691911, bitrate: N/A
Program 0
Metadata:
variant_bitrate : 320000
Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 90k tbn
Metadata:
variant_bitrate : 320000
Stream #0:1(eng): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
Metadata:
variant_bitrate : 320000
RTSP¶
Протокол RTSP не сильно отличается, в нём тоже есть стандартный урл, стандартный способ передачи query string:
$ ffmpeg -i rtsp://localhost:1554/auth-check?token=test1
...
Input #0, rtsp, from 'rtsp://localhost:1554/auth-check?token=test1':
Metadata:
title : Streamer 24.02
Duration: N/A, start: 0.003000, bitrate: N/A
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 90k tbn
Stream #0:1(eng): Audio: aac (LC), 48000 Hz, stereo, fltp
RTMP¶
С RTMP немного сложнее, в этом протоколе нет единого понимания урла и поэтому есть куча разных вариантов, как передать авторизационную информацию. Однако существует сложившаяся практика отправлять query string в параметры функции play, склеивая с именем стрима и ffmpeg именно это и делает:
$ ffmpeg -i rtmp://localhost/static/auth-check?token=test1
...
Input #0, flv, from 'rtmp://localhost/static/auth-check?token=test1':
Metadata:
|RtmpSampleAccess: true
audiochannels : 2
Duration: 00:00:00.00, start: 0.000000, bitrate: N/A
Stream #0:0: Data: none
Stream #0:1: Video: h264 (Constrained Baseline), yuv420p(progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn
Stream #0:2: Audio: aac (LC), 48000 Hz, stereo, fltp, 28 kb/s
SRT¶
Есть отдельная статья про авторизацию проигрывания SRT.
UDP MPEG-TS¶
Протокол UDP MPEG-TS (передача по мультикасту) не включает в себя взаимодействие клиента и сервера, сервер вообще не знает о том, что с него что-то проигрывают и поэтому такой метод авторизации не работает. Облегчает ситуацию то, что мультикаст по интернету не ходит и задачи ограничения доступа немного другие. Для этого используется шифрование и CAS системы.
Как управлять авторизационными токенами¶
Перечисление токенов в конфиге ни в коем случае не может являться основным механизмом. Мы неоднократно видели, как подобные забытые «секретные» ключи, сделанные для удобства отладки сервиса, потом расходятся по интернету и активно используются.
Основной механизм генерации и проверки — реализация на стороне вашего портала (миддлвари, веб-сайта) системы, которая сама генерирует токены и сама их проверяет.
Если у вас еще нет подписки на Flussonic или триальной лицензии, перейдите по ссылке и запросите бесплатный тестовый ключ. Установка сервера займет совсем немного времени, а тестовая конфигурация с которой вы сможете начать, приведена в начале этой статьи.
Так же, технические специалисты Flussonic с удовольствием помогут вам разобраться и найти недорогое и эффективное решение для вашей задачи по защите видео контента от несанкционированного просмотра.