SRS中增加身份验证
作为一个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。
这样一个基本的验证机制就有了,确实不错的轻巧设计!