Управление пользователями и паролями. Как пароли работают в различных плеерах.
Объединение с мембершипом. Готовые решения (платные расширения)

Первый способ — файл паролей

Пароли можно включить или отключить для каждого вещания независимо. Точнее, для каждой точки подключения. Делается это редактированием файла настроек icecast-сервера.

Чтобы закрыть вещание паролем, в конфиг в секцию <mount> нужной точки следует добавить подраздел <authentication>. Выглядит он так:

    <mount>
        <mount-name>/secret-webinar</mount-name>
        <authentication type="htpasswd">
                <option name="filename" value="myauth"/>
                <option name="allow_duplicate_users" value="1"/>
        </authentication>
    </mount>

В тэге <authentication> следует указать атрибут type. Его значение указывает на тип аутентификации. В документации айскаста говорится, что поддерживается единственное значение htpasswd (type="htpasswd"). Но айскат поддерживает и другой тип, о нём ниже.

Тип аутентификации htpasswd указывает, что для опознавания пользователей будет использоваться файл паролей.

Дополнительные свойства паролирования вещания указываются внутри подраздела с помощью тэгов <option>. В подразделе две опции:

  1. filename — имя (и путь) файла, в котором будут храниться имена и пароли пользователей. Для каждой точки может быть собственный файл. А может быть общий для нескольких точек.
  2. allow_duplicate_users — значение типа да/нет. Разрешает или запрещает нескольким слушателям подключаться используя одну и ту же пару имея+пароль. Удобно, если вы хотите задать единственный пароль для всего вещания, а не для каждого слушателя.

Файл паролей

Имена и зашифрованные пароли размещаются в указанном в настройках файле (разделённые двоеточием). Он схож с файлом .htpasswd, используемым веб-сервером apache, но стандартная утилита htpasswd для добавления пользователей не подходит. Точнее, пользователей она добавляет, но пароль айскаст шифрует иначе, потому подключиться такой пользователь не сможет. В то же время удаление пользователей с помощью утилиты htpasswd работает.

Добавить пользователя можно из панели управления айскаста, я расскажу об этом чуть ниже. А сейчас разберёмся с требованиями к файлу паролей.

Требования простые: у айскаста должен быть доступ к файлу.

Для чегоНеобходимые разрешения
Для создания файла Разрешение на запись в директорию
Для добавления пользователей Разрешение на запись в файл
Для удаления пользователей Разрешение на запись в файл
Для авторизации пользователей Разрешение на чтение файла

Как вы помните, в уроке про запись на сервере мы уже встречались с похожими требованиями. С файлом паролей можем поступить так же, как и с файлом записи — разместить его в директории с логами.

Единственное отличие от файла записи — файл паролей может «работать» даже имея только разрешение на чтение. Добавить/удалить пользователей не удастся, но запрос и проверка пароля для доступа к вещанию будут действовать.

Напоминалка

Помним, что после изменения файла настроек, айскаст следует перезапустить. Чтоб новые настройки вступили в силу.

Управление пользователями

Имена и пароли пользователей можно задать в админке icecast. Обратите внимание: при управлении пользователями вещание на нужной точке подключения должно быть запущено. (Можно и без слушателей.) Иначе вы не увидите точку подключения (и команды настройки паролей) в админке.

Точки подключения, для которых разрешено паролирование можно найти на страницах Admin Home и List Mountpoints. Они отмечены жёлтым замком с надписью Login справа. Там, где у открытых (без пароля) точек вещания находятся ссылки для плеера.

Ссылки для плеера при этом скрыты, их можно найти и скопировать на странице команды List Clients.

icecast: страница Admin Home

Ссылка Login ведёт на страницу айскаста с формой авторизации, в которую можно ввести имя и пароль. Но сделано это не очень удобно. После ввода имени+пароля и нажатия кнопки Login браузер скачает файл плейлиста, такой же как M3U. Но внутри дополнительно будут прописаны имя и пароль для авторизации.

Никаких проверок правильности имени и пароля здесь НЕ производится. Поэтому я не рекомендую давать ссылку на эту страницу участникам вебинара. Но если вы откроете скачанный файл в текстовом редакторе, то сможете использовать ссылку из него в плеере. Об этом далее.

Вернёмся на страницу Admin Home или List Mountpoints, где показан список точек подключения. Точка с паролем отличается ещё и дополнительной командой — Manage Authentication. Она и предназначена для управления пользователями.

Создание пользователей

При нажатии на Manage Authentication вы перейдёте на страницу со списком имеющихся пользователей. Если в конфиге айскаста вы указали новый файл, который ещё не создан, список пользователей будет пустой.

Управление пользователями icecast

Под списком находятся поля User Id, Password и кнопка Add New User. C их помощью вы можете добавлять пользователей. Причём:

  • Имена пользователей не могут повторяться.
  • Пароль указывать не обязательно, можно создать пользователя с доступом просто по имени.
  • Можно даже создать пользователя с паролем и пустым именем.
  • Имена пользователей могут быть заданы и русскими буквами.
Удаление и правка пользователей

Чтобы удалить пользователя, нажмите кнопку delete справа от его имени в списке. Никаких дополнительных вопросов задано не будет, пользователь будет сразу удалён из файла и списка. Но если он в данный момент слушает вещание, он не будет отключен.

Встроенных команд для редактирования имени пользователя и пароля нету. Но с помощью имеющихся команд вы можете удалить старого пользователя и создать нового.

Дополнительная информация о слушателях

Для запароленных вещаний в админке айскаста отображается ещё и кто именно из пользователей подключен. Это видно в выводе команды List Clients.

В столбце IP рядом с адресом в скобках показывается имя пользователя. Причём, имя пользователя будет видно даже если вы перенесёте слушателя на точку без пароля командой Move Listeners.

Пользователи icecast в списке слушателей

Плееры и пароли

Пароли на подключение поддерживаются многими популярными плеерами1. Используется самый простой и распространённый способ — HTTP Basic Authentication. При попытке открыть ссылку на вещание в программе-плеере появится примерно такое окно:

Окно авторизации VLC

Или такое:

Окно авторизации iTunes

Похожее окно откроется и при запуске воспроизведения flash-плеером с сайта (в комнате вещания). Его внешний вид зависит от браузера.

В окне всё просто: слушателю следует ввести имя, пароль и нажать кнопку входа. Если имя и пароль указаны верно, начнётся воспроизведение.

Причём, имя и пароль будут запомнены на некоторое время. И в случае обрыва соединения заново спрашиваться не будут.

Некоторые плееры и браузеры сообщают в окне, что пароль будет отправлен в открытом виде. Ничего страшного в этом нет, так работают все не HTTPS сайты.

Подробнее

Передача пароля в открытом виде значит, что если между слушателем и сервером вещания вклинился злоумышленник, он может перехватить пароль. Но для вещания это практически не имеет значения. Больше вероятность, что какой-нибудь слушатель окажется недобросовестным и передаст пароль другим.

Да и почти все сайты, где вход на сайт совершается по HTTP (не HTTPS), подвержены этой угрозе. Поэтому на важные сайты лучше заходить только по HTTPS. Особенно, если вы решите зайти на такой сайт где-нибудь через Wi-Fi из кафе. Тут вероятность вклинивания есть. Но вообще это уже тема другого курса : )

Имя и пароль в ссылке

Иногда удобно запускать вещание без явного ввода пароля. С помощью HTTP Basic Authentication это возможно. Для старта проигрывания без ввода пароля, ссылку вещания можно задать так: http://user:[email protected]:port/mountpoint.

То есть имя пользователя и пароль, разделённые двоеточием указываются перед доменом сайта и символом @. Вместо домена может быть и IP-адрес. Пароль может отсутствовать, тогда двоеточие после него не ставится: http://[email protected]:port/mountpoint.

Если доступ будет разрешён (имя и пароль правильные), начнётся воспроизведение. Если имя и/или пароль не подходят — появится такое же окно с запросом, как будто пароль указан не был.

Этот способ входа в браузерах работает не всегда. Некоторые плееры, как flash, так и html5 в некоторых браузерах, ссылку с внедрённым именем и паролем воспринять не могут. Но способ хорошо работает в обычных программах-плеерах. Только для его использования нужно убрать из ссылки окончание .m3u.

Недостатки входа через файл паролей

Первый способ авторизации довольно простой, но у него есть некоторые недостатки:

  • трудоёмкость добавления большого количества пользователей (иначе один пароль на всех);
  • выставление прав-разрешений на файл паролей и его директорию;
  • если у вас уже есть закрытый клубный раздел сайта, для вещания пользователям нужно вводить пароль ещё раз;
  • некоторые сложности с обычными и браузерными плеерами;
  • отсутствие статистики.

Все эти недостатки отсутствуют во втором способе паролирования вещания. Но у него есть свои требования.

Второй способ авторизации

Авторизация с помощью стороннего сайта. Это одна из мощнейших возможностей айскаста. С помощью неё можно не только интегрировать вещания с мембершипом (сайты с платным доступом), но и организовать продвинутый сбор статистики. И даже обнаружить недобросовестных слушателей, которые раздают пароль от закрытого раздела всем желающим.

Заметка

Этот способ создан в том числе для организации радио или трансляций с платной подпиской и повременной тарификацией.

Файл настроек

Секция точки подключения для внешнего паролирования в общем виде выглядит так:

    <mount>
        <mount-name>/example.ogg</mount-name>
        <authentication type="url">
            <option name="mount_add" value="http://myauthserver.ru/stream_start.php"/>
            <option name="mount_remove" value="http://myauthserver.ru/stream_end.php"/>
            <option name="listener_add" value="http://myauthserver.ru/listener_joined.php"/>
            <option name="listener_remove" value="http://myauthserver.ru/listener_left.php"/>
            <option name="username" value="user"/>
            <option name="password" value="pass"/>
            <option name="auth_header" value="icecast-auth-user: 1"/>
            <option name="timelimit_header" value="icecast-auth-timelimit:"/>
        </authentication>
    </mount>

Как видите, атрибут type теперь имеет значение url, что указывает на внешнюю проверку паролей. Внутри подраздела <authentication> в атрибутах тэгов <option> заданы дополнительные настройки.

Главные настройки — адреса скриптов, которые будут обрабатывать подключения слушателей. Скрипты вы располагаете на своём сервере.

В конце урока я описываю все опции и детали работы этого механизма. На случай если вы захотите реализовать эту возможность самостоятельно или руками специалиста.

Готовые решения

Из готовых решений существует расширение для Joomla. Расширение платное. Оно предназначено для объединения сайта с платным доступом, основанного на Joomla, с комнатой вещаний. Таким образом, что пользователи сайта, которым предоставлен определённый доступ, автоматически получают доступ и к вещанию.

Существует разные способы организации платного доступа на сайте на базе Joomla. О них и о других вещах, касающихся этой CMS вы можете узнать от Александра Куртеева.

Расширение для связи с айскастом использует встроенные в Joomla группы пользователей. И кроме этого умеет работать с пользователями по списку e-mail'ов.

То есть для запуска закрытого вещания достаточно указать разрешённую группу.

Комната вещания может быть расположена как на сайте с Joomla, так и на другом. В первом случае вы можете задать, какой плеер использовать, какое сообщение выводить пользователям без доступа, разместить всё это на нужной странице.

Запуск вещания может быть настроен разными способами. Либо через ввод имени и пароля пользователя сайта. Либо вообще без ввода чего-либо для авторизованных пользователей.

Статистика

Кроме того, расширение собирает разнообразную статистику о вещаниях. С её помощью вы можете узнать, кто слушал вещание, как долго, с какого адреса, каким плеером и т.д. Графики показывают динамику вещания: когда пользователи приходят, сколько времени слушают, когда отключаются. Ну и конечно показывается максимальное число слушателей и как долго этот максимум продолжался.

Кроме того, на графиках и в списках пользователей видны подозрительные действия. Если с одними и теми же именем-паролем подключается несколько слушателей, вы сразу увидите это. А также увидите, какой именно пользователь раскрыл пароль другим. При этом вы сможете с лёгкостью отличить случаи, когда пользователь просто несколько раз переключался на другой плеер. Например в случае неполадок, когда он не мог запустить вещание как следует.

Также в статистике вы можете выделить в отдельную группу слушателей определённого вещания. Или даже какой-то части вещания. И например, сделать рассылку со специальным предложением/бонусом этой группе прямо с сайта с CMS Joomla. Или экспортировать список участников с адресами электронной почты для рассылки с помощью вашего сервиса рассылок.

Где взять

Расширение находится на стадии закрытого тестирования. Получить вы его можете здесь.

Вписывайтесь в список раннего доступа здесь. Как только расширение будет завершено, вы одним из первых узнаете об этом.





Дополнение: как работает внешнее паролирование

Как мы видели, внутри подраздела <authentication> секции <mount> в атрибутах тэгов <option> заданы дополнительные настройки. Рассмотрим, для чего они нужны.

mount_add, mount_remove, listener_add, listener_remove

Адрес скрипта, который проверяет имя и пароль пользователя и предоставляет (или не предоставляет) доступ к вещанию.

ДействиеОписаниеОбязательный
mount_add Вызывается при добавлении точки подключения (начало вещания) нет
mount_remove Вызывается при удалении точки подключения (завершение вещания) нет
listener_add Вызывается при подключении слушателя да
listener_remove Вызывается при отключении слушателя нет

Как только происходит одно из указанных событий, айскаст обращается по указанному адресу. Если параметр не указан, обращения не происходит. В параметрах POST-запроса icecast сообщает информацию о себе, о точке подключения и о слушателе. Параметры запроса зависят от действия:

ДействиеПараметры запроса
mount_add action=mount_add&mount=/air&server=mysite.ru&port=8000
mount_remove action=mount_remove&mount=/air&server=mysite.ru&port=8000
listener_add action=listener_add&server=mysite.ru&port=8000&client=1&mount=/air&user=&pass=&ip=127.0.0.1&agent=My%20player
listener_remove action=listener_remove&server=mysite.ru&port=8000&client=1&mount=/air&user=&pass=&duration=3600&ip=127.0.0.1&agent=My%20player

Каждый запрос содержит параметры:

ПараметрОписание
action действие, (можно указать один скрипт, а действие определять по этому параметру)
mount имя точки подключения
server сервер айскаста (<hostname> из файла настроек)
port порт айскаста

Запросы, касающиеся пользователей дополнительно содержат параметры:

ПараметрОписание
client внутренний номер слушателя; тот же при отключении, что был при подключении
user имя пользователя при Basic Auth авторизации
pass пароль пользователя при Basic Auth авторизации
ip IP- адрес слушателя
agent плеер/браузер, используемый слушателем
duration продолжительность соединения — сколько секунд слушатель слушал
username, password

Параметры в документации не описаны, можно обойтись и без них.

auth_header

HTTP-заголовок возвращаемый внешним (вашим) сервером, означающий, что пользователю разрешён доступ. Этот заголовок следует вернуть при запросе listener_add, для остальных запросов он не проверяется. По умолчанию (если не задан в настройках) айскаст ожидает встретить заголовок icecast-auth-user: 1. Но вы можете назначить любой, хоть HTTP 200 OK.

timelimit_header

Заголовок, опять же при запросе listener_add, ограничивающий продолжительность соединения (в секундах). Если сервер его не вернул, слушатель остаётся подключен без ограничения времени. Если вернул, слушатель будет отключен по истечении указанного числа секунд. Заголовок можно применить для организации вещаний по подписке.

Пример

Пусть в настройке <timelimit_header> указано icecast-auth-timelimit:. Если мы хотим отключить слушателя через две минуты, то наш сервер должен вернуть заголовок icecast-auth-timelimit: 120.

Скрипт

Таким образом, скрипт по минимуму должен обрабатывать действие listener_add. При получении запроса он должен определить, следует ли давать пользователю доступ или нет. И вернуть серверу вещания ответ, выставив или нет разрешающий заголовок.

Скрипт также может проверять IP-адрес с которого пришёл запрос. Это всегда должен быть IP сервера вещания. Слушатели не имеют прямого доступа к серверу и скрипту авторизации.

Ну и конечно скрипт может принимать решение основываясь на других запросах и параметрах запросов. Например, по значению параметра duration запроса listener_remove можно определить, на сколько уменьшить «количество» предоплаченного времени доступа. Или наоборот, засчитывать пользователю время прослушивания.


  1. Из популярных, но не поддерживающих знаю Vox и AIMP.