1. 程式人生 > >nginx-rtmp-module授權機制實現直播推流多房間授權認證

nginx-rtmp-module授權機制實現直播推流多房間授權認證

假設nginx直播伺服器已經搭建完畢,如果還沒有搭建完畢可以查閱利用nginx的nginx-rtmp-module搭建流媒體直播伺服器這篇文章。在開發直播專案時推流應該是需要做許可權認證的,不是任何人都可以隨意向直播伺服器推流,這就需要許可權認證,實現起來也不復雜,只需要在nginx配置檔案中的rtmp->server->application 下配置on_publish選項就可以,下面給出關鍵示例配置:

application hls {  #rtmp推流請求路徑
   live on;
   on_publish http://驗證伺服器域名/check.php; #授權地址 推流時會請求
   on_publish_done  http://驗證伺服器域名/check.php; #推流結束時請求
   hls on;
   hls_path /home/wwwroot/video/hls;
   hls_fragment 5s;
}

通過以上配置可以看到on_publish 和麵跟的引數是一個授權url ,在推流客戶端推流時會請求該url,如果對應的url響應狀態碼為200則推流會成功,如果返回其他異常狀態碼404或者500等則會推流失敗。
  那麼推流時如何向該url地址傳送對應的認證資訊,請求到對應的url後又如何認證呢,首先看一下推流客戶端如何請求,以OBS為例只需要在流名稱後加入類似GET請求引數的資料格式即可,假設流名稱為edu則流名稱可以這樣設定edu?password=123456這樣就設定了認證密碼為123456,在推流時會有幾個引數POST到認證url,下面給出示例引數

[app] => hls
[flashver] => LNX 11,2,202,233
[swfurl] => 
[tcurl] => rtmp://推流地址:1935/hls
[pageurl] => 
[addr] => 192.168.8.223
[clientid] => 38
[call] => publish
[name] => edu
[type] => live
[password] => 123456

這樣可以在程式中使用$_POST['password']獲取到對應的認證密碼,並作出對應的處理,示例程式碼如下

// 如果認證不成功 響應狀態碼404
if(($_POST['name'] == 'edu') && ($_POST['password'] != '123456')){
	header('HTTP/1.0 404 Not Found');
}

這樣就可以作出認證了,當然可以設定多個流名稱(頻道)對應多個密碼。另外on_publish_done配置項和on_publish傳遞的引數幾乎一樣,只是on_publish在推流開始時會請求並執行認證流程,而on_publish_done在推流結束時請求。