zoukankan      html  css  js  c++  java
  • 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。 

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

  • 相关阅读:
    mysql
    makefile
    KNN算法(k-nearest neighbor)
    时间序列
    python易错题之lambda 以及 for循环中内嵌函数
    python易错题之作用域
    html----不常见标签
    js----DOM对象(3
    js----DOM对象(事件)
    js----对象
  • 原文地址:https://www.cnblogs.com/hrybird/p/5125182.html
Copyright © 2011-2022 走看看