Как произвести аутентификацию пользователя при работе с 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 очень жесток к клиентам)

  • Более продуктивные варианты:

Авторизацию пользователя на поток без сайта можно сделать примерно так:

  1. Добавить предварительную HTTP-авторизацию. Опорный пример в документации: https://nginx.org/ru/docs/http/ngx_http_auth_request_module.html. К базе подключение и сверка base_auth как обычно для http_auth
  2. Создать точку входа на поток и добавить proxy_pass + keepalive on на поток от ffmpeg в конфиге. Оригинальный поток можно перенаправить, например в udp, чтобы клиент воспринимал поток Однако, такой механизм у меня работал лет 6 назад с промежуточным скриптом-кодировщиком (вместо nginx-rtpm-module), так что сейчас могут быть более простые и надежные подходы. Например, задействовать HLS/MPEG-DASH

Авторизация пользователя на сайте и просмотр в форме. Я бы рассматривал такой подход в общих чертах:

  1. Авторизация на странице как обычно (http_base_auth или через формы)
  2. По факту поиска сгенерировать уникальную пару "логин-пароль" - что угодно, сохранить на время работы со стримом
  3. Добавить предаварительную авторизацию на страницу с проксей на стрим, к которой будет подходить авторизация из пункта выше (например, превращая средствами ffmpeg rtmp в udp/http). Действовать по примеру: https://nginx.org/ru/docs/http/ngx_http_auth_request_module.html
  4. В плеере прокидывать авторизацию - тут зависит от плеера. Например, можно для javasctipt-управляемых плееров посмотреть обсуждение в англоязычном https://stackoverflow.com/questions/33505130/how-to-assign-basic-authentication-header-to-xmlhttprequest 4.1) Еще можно попробовать добавить фильтр по параметру pageUrl который прилетает от клиента во время on_play - пможно попробовать задейстовать его (например, в качестве "логина")
  5. При наступлении события "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

→ Ссылка