Пароль для публикации потока

Alex Po

Member
Добрый день
Можете подсказать, какие настройки необходимо внести в сервер для того, чтобы установить авторизацию для публикации потоков как по rtmp, так и через websocket - не нашел я описание этого в документации.
Во всех примерах публикация происходит без авторизации - получается, что кто угодно может использовать мой сервер для публикации своего стрима.
 

Max

Administrator
Staff member
Пример с запретом публикации потока описан здесь
Чтобы его реализовать, нужно сделать следующее:
1. Реализовать два скрипта, возвращающие JSON на любой технологии.
http://script/connect
http://script/publishStream
Ваши скрипты должны возвращать тот JSON, который получили (echo).
Например:
Request
Code:
{
URL:http://localhost:9091/EchoApp/connect
OBJECT:
  "nodeId" : "KsYJFoOZzUl5F6Gl545v4Jf6Ip69fGW1@192.168.1.59",
  "appKey" : "defaultApp",
  "sessionId" : "/192.168.1.38:63503/192.168.1.59:8443",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false,
  "mediaProviders" : [ "WebRTC", "WSPlayer" ],
  "clientVersion" : "0.5.13",
  "clientOSVersion" : "5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
  "clientBrowserVersion" : "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}
Response
Code:
URL:http://localhost:9091/EchoApp/connect
OBJECT:
{
  "nodeId" : "KsYJFoOZzUl5F6Gl545v4Jf6Ip69fGW1@192.168.1.59",
  "appKey" : "defaultApp",
  "sessionId" : "/192.168.1.38:63503/192.168.1.59:8443",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false,
  "mediaProviders" : [ "WebRTC", "WSPlayer" ],
  "clientVersion" : "0.5.13",
  "clientOSVersion" : "5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
  "clientBrowserVersion" : "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}
По-умолчанию эти вызовы идут на http://localhost:9091/EchoApp
Логи выводятся в /usr/local/FlashphonerWebCallServer/logs/flashphoner_manager.log

2. В ответе на connect вернуть дополнительное поле
Code:
"restClientConfig":
{
       "publishStream":
               {
                       "restExclude":"",
                       "clientExclude":"",
                       "restOnError":"FAIL",
                       "restPolicy":"NOTIFY",
                       "restOverwrite":""
               }
}
3. На запрос http://script/publishStream вернуть HTTP-статус 403 Forbidden.

4. Указать новый URL
update app -l http://script defaultApp
remove app-rest-method -a defaultApp
add app-rest-method connect defaultApp
add app-rest-method publishStream defaultApp

На шаге 1 создаются два скрипта, которые отвечают за аутентификацию и возвращают JSON (contentType: application/json)
На шаге 2 в теле ответа 200 OK на connect добавляется поле restClientConfig, которое описывает поведение метода publishStream, restOnError:FAIL.
Это значит что если publishStream не получит 200 ОК, то операция публикации потока не выполнится и будет ошибка.
На шаге 3 возвращаем 403 Forbidden чтобы запретить публикацию данного потока.
 
Last edited:

Max

Administrator
Staff member
Ссылки на документацию:
RestClientConfig - определение поведения методов при первом подключении (connect)
REST apps и REST methods - добавление / удаление REST приложений и методов
CLI - интерфейс командной строки
 

Max

Administrator
Staff member
При создании и публикации потока можно передать произвольный объект, например custom:{token:'12345'}
Code:
session.createStream({name:'stream1',custom:{token:'12345'}}).publish();
Этот объект будет передан вашему скрипту на обработку: http://script/publishStream
Если вернуть 200 ОК, публикация пройдет.
Если вернуть 403 Forbidden, публикация потока не пройдет.
 

Alex Po

Member
не совсем понятно какой должен быть итоговый ответ в пункте 2. Такой или нет?:
Code:
OBJECT:
{
  "nodeId" : "kPeSvMn1PFqIMCxZ1Ry6dJ0JNiZ9cqZw@89.179.119.95",
  "appKey" : "defaultApp",
  "sessionId" : "/172.16.16.139:49405/89.179.119.95:8443",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false,
  "mediaProviders" : [ "WebRTC", "WSPlayer" ],
  "clientVersion" : "0.5.12",
  "clientOSVersion" : "5.0 (Android 5.1.1)",
  "clientBrowserVersion" : "Mozilla/5.0 (Android 5.1.1; Mobile; rv:50.0) Gecko/50.0 Firefox/50.0",
  "restClientConfig":
  {
     "publishStream":
     {
        "restExclude":"",
        "clientExclude":"",
        "restOnError":"FAIL",
        "restPolicy":"NOTIFY",
        "restOverwrite":""
     }
  }
}
 

Alex Po

Member
да, все верно - у меня получилось. А как быть с публикацией rtmp потока?
 

Max

Administrator
Staff member
не совсем понятно какой должен быть итоговый ответ в пункте 2. Такой или нет?
Да, такой.
А как быть с публикацией rtmp потока?
Если RTMP поток публикуется с HTML-страницы, то используется тоже самое API, что и для WebRTC. Например, если коннект из браузера IE, то делать ничего не нужно.
Если же RTMP поток публикуется с произвольного источника, например FMLE или native Flash, то его можно сбрасывать на шаге подключения. Т.е. вернув HTTP response 403 Forbidden прямо на метод connect.
Для Flash коннектов используются два REST приложения с ключами: flashStreamingApp и flashRoomApp
Все приложения можно вывести командой
Code:
show apps -d
showapps-d.jpg
Коннект из ActionScript будет выглядеть так
Code:
var obj = new Object();
obj.appKey = 'flashStreamingApp';
obj.custom = new Object();
obj.custom.token = '12345';
var conn = new NetConnection();
conn.connect('rtmp://192.168.1.5:1935/live',obj);
Остается сделать
Code:
update app -l http://script  flashStreamingApp
чтобы переключить управление RTMP коннектом на кастомный URL: http://script
 

Alex Po

Member
Из flashphoner_manager.log после запуска rtmp потока на сервер:
Code:
URL:http://xxxxxxxxxxxxx/flashphoner/connect
OBJECT:
{
  "nodeId" : "kPeSvMn1PFqIMCxZ1Ry6dJ0JNiZ9cqZw@xx.xx.xx.xx",
  "appKey" : "flashStreamingApp",
  "sessionId" : "92ca3133-e9f2-437b-ac6b-27fac839ff70",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false
}
10:01:10,781 WARN  RestTemplate - RMI TCP Connection(246)-127.0.0.1 POST request for "http://xxxxxxxxxxxxx/flashphoner/connect" resulted in 403 (Forbidden); invoking error handler
отдаю 403 сразу на connect, а поток все-равно принимается - что не так?
 
Last edited:

Max

Administrator
Staff member
Выглядит корректно. Проверим у себя. По результатам отпишу.
 

Max

Administrator
Staff member
Добавили фикс в сборке сервера 2035. Еще не тестировали.
 

Max

Administrator
Staff member
Чтобы обновиться, нужно скачать и распаковать архив сервера и выполнить следующие команды:
Code:
service webcallserver stop
./install.sh
service webcallserver start
 

Alex Po

Member
Сделал Update Flashphoner from 5.0.2005 to 5.0.2042 - все работает!
Code:
12:17:03,327 INFO  agerRemoteRmiService - RMI TCP Connection(4)-127.0.0.1 SEND REST OBJECT ==>
URL:http://xxxxxxxxxx/flashphoner/connect
OBJECT:
{
  "nodeId" : "kPeSvMn1PFqIMCxZ1Ry6dJ0JNiZ9cqZw@xx.xx.xx.xx",
  "appKey" : "flashStreamingApp",
  "sessionId" : "301e34b0-80ab-4630-a313-20249b43961d",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false
}
12:17:04,651 WARN          RestTemplate - RMI TCP Connection(4)-127.0.0.1 POST request for "http://xxxxxxxxxx/flashphoner/connect" resulted in 403 (Forbidden); invoking error handler
После этого ffmpeg выдает: Closing connection: NetStream.Failed
 

pride

Member
Что то нечего не понял, как сервер WCS узнает о существовании моих этих 2-х скриптов ?
Code:
4. Указать новый URL
update app -l http://script defaultApp
remove app-rest-method -a defaultApp
add app-rest-method connect defaultApp
add app-rest-method publishStream defaultApp
Где и как выполнять эти команды?


Пример с запретом публикации потока описан здесь
Чтобы его реализовать, нужно сделать следующее:
1. Реализовать два скрипта, возвращающие JSON на любой технологии.
http://script/connect
http://script/publishStream
Ваши скрипты должны возвращать тот JSON, который получили (echo).
Например:
Request
Code:
{
URL:http://localhost:9091/EchoApp/connect
OBJECT:
  "nodeId" : "KsYJFoOZzUl5F6Gl545v4Jf6Ip69fGW1@192.168.1.59",
  "appKey" : "defaultApp",
  "sessionId" : "/192.168.1.38:63503/192.168.1.59:8443",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false,
  "mediaProviders" : [ "WebRTC", "WSPlayer" ],
  "clientVersion" : "0.5.13",
  "clientOSVersion" : "5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
  "clientBrowserVersion" : "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}
Response
Code:
URL:http://localhost:9091/EchoApp/connect
OBJECT:
{
  "nodeId" : "KsYJFoOZzUl5F6Gl545v4Jf6Ip69fGW1@192.168.1.59",
  "appKey" : "defaultApp",
  "sessionId" : "/192.168.1.38:63503/192.168.1.59:8443",
  "useWsTunnel" : false,
  "useWsTunnelPacketization2" : false,
  "useBase64BinaryEncoding" : false,
  "mediaProviders" : [ "WebRTC", "WSPlayer" ],
  "clientVersion" : "0.5.13",
  "clientOSVersion" : "5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
  "clientBrowserVersion" : "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}
По-умолчанию эти вызовы идут на http://localhost:9091/EchoApp
Логи выводятся в /usr/local/FlashphonerWebCallServer/logs/flashphoner_manager.log

2. В ответе на connect вернуть дополнительное поле
Code:
"restClientConfig":
{
       "publishStream":
               {
                       "restExclude":"",
                       "clientExclude":"",
                       "restOnError":"FAIL",
                       "restPolicy":"NOTIFY",
                       "restOverwrite":""
               }
}
3. На запрос http://script/publishStream вернуть HTTP-статус 403 Forbidden.

4. Указать новый URL
update app -l http://script defaultApp
remove app-rest-method -a defaultApp
add app-rest-method connect defaultApp
add app-rest-method publishStream defaultApp

На шаге 1 создаются два скрипта, которые отвечают за аутентификацию и возвращают JSON (contentType: application/json)
На шаге 2 в теле ответа 200 OK на connect добавляется поле restClientConfig, которое описывает поведение метода publishStream, restOnError:FAIL.
Это значит что если publishStream не получит 200 ОК, то операция публикации потока не выполнится и будет ошибка.
На шаге 3 возвращаем 403 Forbidden чтобы запретить публикацию данного потока.
 
Last edited:

Max

Administrator
Staff member
Что то нечего не понял, как сервер WCS узнает о существовании моих этих 2-х скриптов ?
Выше есть ссылка на CLI
Это интерфейс коммандной строки.
Чтобы внего зайти, нужно в консоли набрать:
Code:
ssh -p 2000 admin@localhost
Пароль - тот, что был при установлен при установке в админке.
Далее можно использовать команды, перечисленные в документации.
Например
Code:
show apps
show apps -d
help
show -help
и т.д.

как сервер WCS узнает о существовании моих этих 2-х скриптов
Например такой командой:
Code:
update app -l http://script defaultApp
В этом случае обращения будут идти на:
Code:
http://script/connect
http://script/publish
http://script/play
и т.д.
 

Alex Po

Member
А можно в форуме ссылки вставлять? У меня есть статья "REST API Web Call Server 5 (Flashphoner) с использованием Apache2 и php"... ну или в крайнем случае по этой фразе можно загуглить, надеюсь поможет.
 

pride

Member
А можно в форуме ссылки вставлять? У меня есть статья "REST API Web Call Server 5 (Flashphoner) с использованием Apache2 и php"... ну или в крайнем случае по этой фразе можно загуглить, надеюсь поможет.
Спасибо, я разобрался сделал связку WCS + NodeJS + Apache. У меня очень специфические нужды ))
 

Max

Administrator
Staff member
А можно в форуме ссылки вставлять?
Если полезная ссылка, почему бы и не вставить.
REST API Web Call Server 5 (Flashphoner) с использованием Apache2 и php

Для более полного понимания работы REST Hooks (а это именно крючки, за которые дергает WCS), можно ознакомится с документацией Call Flow
Она немного устарела в деталях и некоторых полей REST запросов может не хватать в описании, но принципы работы, описанные там актуальны.
Основное:
1. Есть четыре типа методов (REST hooks). Каждый тип имеет свою логику.
  • connect
  • прямые вызовы
  • события
  • входящие вызовы
2. Каждый REST hook метод по-умолчанию должен возвращать ответ Echo (тоже самое, что получил) и статус HTTP 200 OK.
3. В методе connect можно конфигурировать поведение всех остальных методов.
4. Возвращая статсусы ошибок 4xx HTTP можно авторизовывать попытки play, publish, и т.д.
5. Меняя поля, можно переопределять и подставлять другие значения. Например, можно передать имя потока stream1 в play, а на REST подменить его на rtsp://host:554/stream1 и таким образом скрыть реальный адрес потока.
6. Ну и конечно же получать информацию об IP адресах, сессиях, стримах, звонках, реализовывать аутентификацию по паролю или токену, используя серверные скрипты: php, jsp, node js, и т.д.
 
Top