• 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。 

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

  • 相关阅读:
    lintcode-453-将二叉树拆成链表
    qcow2虚拟磁盘映像转化为vmdk
    wiki
    oracle
    mysql配置记录
    consul命令记录
    Prometheus监控elasticsearch集群(以elasticsearch-6.4.2版本为例)
    centos7修改网卡名称为eth0
    linux下将普通用户加入到docker组,使它可以运行docker命令
    CentOS配置history记录每个用户执行过的命令
  • 原文地址:https://www.cnblogs.com/hrybird/p/5125182.html
Copyright © 2020-2023  润新知