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。 

 

这样一个基本的验证机制就有了,确实不错的轻巧设计!

posted @ 2016-01-12 18:02  dlbtsoft  阅读(8483)  评论(0编辑  收藏  举报