作為一個rtmp服務器,基本的驗證機制是需要有的,srs很巧妙的使用了http callback的方式來實現驗證機制,我測試的情況如下:
1)首先,在服務器上,使用了如下配置:
listen 1935; max_connections 1000; vhost __defaultVhost__ { gop_cache off; queue_length 10; min_latency on; mr { enabled off; } mw_latency 100; tcp_nodelay on; http_hooks { enabled on; on_connect http://你服務器的IP/valid/test.php; on_close http://你服務器的IP/test.php; on_publish http://你服務器的IP/test.php; on_unpublish http://你服務器的IP/test.php; on_play http://你服務器的IP/test.php; on_stop http://你服務器的IP/test.php; } }
其中,http_hooks就是掛接一些回調通知。 其它的主要是我測試的合適的低延時的一些配置,實測可以在1s左右的延時,很不錯。
將“你服務器的IP”改為您網站的域名或者IP即可。然后建立一個test.php文件,如下代碼:
<?php $verifyData = file_get_contents("php://input"); //$verifyData = "{\"action\":\"on_play\",\"client_id\":105,\"ip\":\"139.71.22.215\",\"vhost\":\"__defaultVhost__\",\"app\":\"live\",\"tcUrl\":\"rtmp://ip:1935/live?user=player&pwd=123\",\"pageUrl\":\"\"}"; $obj=json_decode($verifyData); if ( $obj->action == "on_connect"){ echo "0"; } else if ( $obj->action == "on_close"){ echo "0"; } else if ( $obj->action == "on_publish"){ $arr = parse_url($obj->tcUrl); $arr_query = convertUrlQuery($arr['query']); if ($arr_query["user"] == "pub" && $arr_query["pwd"] == "123") { echo "0"; } else { echo "1"; } } else if ( $obj->action == "on_unpublish"){ echo "0"; } else if ( $obj->action == "on_play"){ //$arr = parse_url($obj->tcUrl); //$arr_query = convertUrlQuery($arr['query']); //if ($arr_query["user"] == "player" && $arr_query["pwd"] == "123") { // echo "0"; //} //else { // echo "1"; //} echo "0"; } else if ( $obj->action == "on_stop"){ echo "0"; } else if ( $obj->action == "on_dvr"){ echo "0"; } else{ echo "1"; } function convertUrlQuery($query) { $queryParts = explode('&', $query); $params = array(); foreach ($queryParts as $param) { $item = explode('=', $param); $params[$item[0]] = $item[1]; } return $params; } function getUrlQuery($array_query) { $tmp = array(); foreach($array_query as $k=>$param) { $tmp[] = $k.'='.$param; } $params = implode('&',$tmp); return $params; } ?>
這樣,每次無論推流還是觀看,第一次進入會進入on_connect。 然后此時建議記錄clientid(連接的標記),以及該clientID對應的用戶信息。
比如,如果推流地址為 rtmp://127.0.0.1:1935/live/test?user=zhangsan&pass=123
可能第一次on_connect時收到的connect ID為 152, 此時需要php里面記錄下152的連接對應的用戶名是zhangsan。(本php代碼中沒有演示如何記錄,隨便你存內存還是數據庫,自己想辦法存)
然后在on_publish時來驗證張三有無推流到這個地址的權限。
看官你可能問了,為什么不直接在on_connect時判斷呢? 原因是剛連上來,我不知道這個張三是要推流,還是觀看。所以先留下來,等on_publish或者on_play再去校驗。on_connect可以只做初步判斷和記錄。
推流驗證可以在on_publish,播放驗證需要在on_connect保存clientid對應的tcurl,並在on_play驗證tcurl。
這樣一個基本的驗證機制就有了,確實不錯的輕巧設計!
