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。 

 

這樣一個基本的驗證機制就有了,確實不錯的輕巧設計!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM