Как произвести аутентификацию пользователя при работе с nginx c rtmp
Как произвести аутентификацию пользователя при работе с nginx c rtmp Сейчас у меня транслируются все потоки, а как произвести аутентификацию с зарегис. пользователей. OBS передаёт имя пользователя и пароль. Логин и пароль пользователей мы должны брать из базы данных зарегистрированных пользователей на сайте. Помогите разобраться!
rtmp {
server {
listen 1935;
ping 30s;
notify_method get;
application live {
live on;
exec_push /usr/bin/ffmpeg -i rtmp://domen.ru/live/$name -c copy /path/videos/$name.m3u8 ;
}
}
}
Ответы (1 шт):
Если нужна авторизация для publish: начни с https://github.com/Nesseref/nginx-rtmp-auth
Согласно исходникам по ссылке, нужно добавить в конфиг nginx.conf что-то похожее:
on_publish http://localhost:5000/auth;
Далее задача - обработать обычный http-запрос (пришедший на http://localhost:5000/auth), в котором пара - логин и пароль соответствненно:
username = request.args.get('name')
idhash = request.args.get('swfurl').split("?")[-1]
Дополнено: По коду ответа определяется успех. Коды, отличные от 200 считаются за неуспех и разрывают соединение. Код 200 успешный и допускает пользователя
Авторизация по on_play: скорее всего, не сработает, как надо, так как это потребует для пользователей создавать отдельный стрим (протокол RTMP очень жесток к клиентам)
- Более продуктивные варианты:
Авторизацию пользователя на поток без сайта можно сделать примерно так:
- Добавить предварительную HTTP-авторизацию. Опорный пример в документации: https://nginx.org/ru/docs/http/ngx_http_auth_request_module.html. К базе подключение и сверка base_auth как обычно для http_auth
- Создать точку входа на поток и добавить proxy_pass + keepalive on на поток от ffmpeg в конфиге. Оригинальный поток можно перенаправить, например в udp, чтобы клиент воспринимал поток Однако, такой механизм у меня работал лет 6 назад с промежуточным скриптом-кодировщиком (вместо nginx-rtpm-module), так что сейчас могут быть более простые и надежные подходы. Например, задействовать HLS/MPEG-DASH
Авторизация пользователя на сайте и просмотр в форме. Я бы рассматривал такой подход в общих чертах:
- Авторизация на странице как обычно (http_base_auth или через формы)
- По факту поиска сгенерировать уникальную пару "логин-пароль" - что угодно, сохранить на время работы со стримом
- Добавить предаварительную авторизацию на страницу с проксей на стрим, к которой будет подходить авторизация из пункта выше (например, превращая средствами ffmpeg rtmp в udp/http). Действовать по примеру: https://nginx.org/ru/docs/http/ngx_http_auth_request_module.html
- В плеере прокидывать авторизацию - тут зависит от плеера. Например, можно для javasctipt-управляемых плееров посмотреть обсуждение в англоязычном https://stackoverflow.com/questions/33505130/how-to-assign-basic-authentication-header-to-xmlhttprequest 4.1) Еще можно попробовать добавить фильтр по параметру pageUrl который прилетает от клиента во время on_play - пможно попробовать задейстовать его (например, в качестве "логина")
- При наступлении события "on_play_done" и "on_publish_done" можно, по идее очистить доступы спустя, например, 15 минут
Иногда рекомендуют все запросы обернуть в basic_auth, но я его с rtmp не пробовал, да и протокол не упоминает, что так можно: https://wwwimages2.adobe.com/content/dam/acom/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf