按上回继续,安全论证是绝大多数应用的基本要求,如果任何人都能无限制的发布/播放视频,显然不适合。SRS中可以通过HTTPCallback机制来实现,参考下面的配置:

  1. ...
  2.  
  3. vhost __defaultVhost__ {
  4. ...
  5.  
  6. # http回调
  7. http_hooks{
  8. enabled on;
  9. on_connect http://192.168.7.100:9000/srs_http_call_back;
  10. on_close http://192.168.7.100:9000/srs_http_call_back;
  11. on_publish http://192.168.7.100:9000/srs_http_call_back;
  12. on_unpublish http://192.168.7.100:9000/srs_http_call_back;
  13. on_play http://192.168.7.100:9000/srs_http_call_back;
  14. on_stop http://192.168.7.100:9000/srs_http_call_back;
  15. on_dvr http://192.168.7.100:9000/srs_http_call_back;
  16. on_hls http://192.168.7.100:9000/srs_http_call_back;
  17. on_hls_notify http://192.168.7.100:9000/srs_http_call_back;
  18. }
  19. }

只要打开http_hooks,然后在各个事件中,配置回调的url即可。(大家可以把上面的192.168.7.100换成实际地址)

回调的http url有二个基本要求:

1、 srs服务器能正常访问该url

2、该url接受post参数,如果校验成功,http status必须返回200,同时输出0,否则视为校验失败

post参数的json格式示例如下:

  1. {
  2. "action": "on_connect",
  3. "client_id": 1985,
  4. "ip": "192.168.1.10",
  5. "vhost": "video.test.com",
  6. "app": "live",
  7. "tcUrl": "rtmp://x/x?key=xxx&uid=jimmy",
  8. "pageUrl": "http://x/x.html"
  9. }

这里,我们用spring boot(groovy语言)实现一个最基本的on_connect安全校验(注:仅出于演示目的,只要tcUrl中包括jimmy这个字符串就算通过,实际应用中,可以从db中校验,并结合一定的加解密算法,校验有效性)

  1. @RestController
  2. class SrsHttpCallBack{
  3. @RequestMapping("/srs_http_call_back")
  4. String auth(@RequestBody CallBackRequestData data){
  5. if (data){
  6. println data.dump()
  7. if (data.action=="on_connect"){
  8. //简单示例:仅校验on_connect(校验只有jimmy这个用户,允许连接)
  9. if (data.tcUrl!=null && data.tcUrl.indexOf("jimmy")!=-1){
  10. //pass
  11. return "0"
  12. }
  13. else{
  14. // fail
  15. return "-1"
  16. }
  17. }
  18. }
  19. //其它情况,返回成功
  20. "0"
  21. }
  22.  
  23. @RequestMapping("/")
  24. String home(){
  25. "hello world"
  26. }
  27. }
  28.  
  29. @groovy.transform.ToString
  30. class CallBackRequestData{
  31. def action
  32. def client_id
  33. def ip
  34. def vhost
  35. def app
  36. def tcUrl
  37. def pageUrl
  38. def send_bytes
  39. def recv_bytes
  40. def stream
  41. def file
  42. def cmd
  43.  
  44. } 

随便找个编辑器(比如:vscode),把上面的代码复制进去,保存为http_call_back.groovy,然后利用springboot cli,启动:

  1. spring run http_call_back.groovy -- --server.port=9000

注:如果srs与spring boot cli都在本机,注意要把端口错开,否则都是8080端口,容易冲突

这样,一个最基本的http call back server就ok了。(注:对spring boot cli不熟悉的同学,可参考spring-boot 速成(1) helloworld

建议先用postman之类的http rest工具,做下测试:

将/etc/init.d/srs reload 让配置生效,然后obs的推流地址,改成类似:

rtmp://localhost:1935/live?uid=jimmy 

然后播放器(比如VLC Player)中,播放的地址要改成:

rtmp://localhost:1935/live?uid=jimmy/livestream

再观察spring boot clil中的输出,应该可以看到类似下面的日志:

...

<CallBackRequestData@637ab6fc action=on_connect client_id=215 ip=172.17.0.1 vhost=__defaultVhost__ app=live tcUrl=rtmp://localhost:1935/live?uid=jimmy pageUrl= send_bytes=null recv_bytes=null stream=null file=null cmd=null>
<CallBackRequestData@3fa5cd6d action=on_publish client_id=215 ip=172.17.0.1 vhost=__defaultVhost__ app=live tcUrl=rtmp://localhost:1935/live?uid=jimmy pageUrl=null send_bytes=null recv_bytes=null stream=livestream file=null cmd=null>

...

<CallBackRequestData@7942880d action=on_connect client_id=239 ip=172.17.0.1 vhost=__defaultVhost__ app=live tcUrl=rtmp://localhost:1935/live?uid=jimmy pageUrl= send_bytes=null recv_bytes=null stream=null file=null cmd=null>
<CallBackRequestData@4f6cc49d action=on_play client_id=239 ip=172.17.0.1 vhost=__defaultVhost__ app=live tcUrl=null pageUrl= send_bytes=null recv_bytes=null stream=livestream file=null cmd=null>
<CallBackRequestData@10cc39b5 action=on_hls client_id=230 ip=172.17.0.1 vhost=__defaultVhost__ app=live tcUrl=null pageUrl=null send_bytes=null recv_bytes=null stream=livestream file=./objs/nginx/html/live/livestream-186.ts cmd=null>

...

有兴趣的同学,可以把rtmp url中的jimmy改成其它值,比如guest试试,应该就不能播放了。

注:对于播放器端,只有rtmp协议,上述安全校验才起作用,对于hls/http-flv这种方式的播放,http callback无效;但是考虑到推流(即:直播的源头)基本上都是rtmp协议,http callback是可以工作的,相当于把视频发布源头控制住了。

参考文章:

https://github.com/ossrs/srs/wiki/v2_CN_HTTPCallback

开源流媒体服务器SRS学习笔记(3) - HTTPCallback实现安全认证的更多相关文章

  1. 开源流媒体服务器SRS学习笔记(1) - 安装、推流、拉流

    SRS(Simple RTMP Server)  是国人写的一款非常优秀的开源流媒体服务器软件,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群. 一.安装 官网提供了3种安 ...

  2. 开源流媒体服务器SRS学习笔记(2) - rtmp / http-flv / hls 协议配置 及跨域问题

    对rtmp/http-flv/hls这三种协议不熟悉的同学,强烈建议先看看网友写的这篇文章科普下:理解RTMP.HttpFlv和HLS的正确姿势 .   srs可以同时支持这3种协议,只要修改conf ...

  3. 开源流媒体服务器SRS学习笔记(4) - Cluster集群方案

    单台服务器做直播,总归有单点风险,利用SRS的Forward机制 + Edge Server设计,可以很容易搭建一个大规模的高可用集群,示意图如下 源站服务器集群:origin server clus ...

  4. NodeJS版本EasyDarwin开源流媒体服务器开发心得

    title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...

  5. EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布

    EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...

  6. EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法

    EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...

  7. 我为什么选择采用node.js来做新一代的EasyDarwin RTSP开源流媒体服务器

    在去年我们还未开始开发基于node.js的新版本EasyDarwin RTSP开源流媒体服务器的时候,我写了一篇博客<对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更 ...

  8. EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路

    背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...

  9. EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...

随机推荐

  1. 【BZOJ4998】星球联盟

    题解: 应该还是比较水的 首先很容易发现的就是两个点一旦联通他们就永远联通了 所以联通之后我们就把他们之间缩成一个点

  2. python导入import

    1.参考 Python 相对导入与绝对导入 2.Python import 的搜索路径 在当前目录下搜索该模块 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索 在 Python 安装路径 ...

  3. mysql 5.6.25编译安装详细步骤

    简略步骤: mysql5.6.25编译安装步骤: 下载mysql准备用户和组yum安装依赖解压mysqlcmake编译mysqlmake && make install ----时间约 ...

  4. Centos创建定时任务和开机启动运行脚本

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArYAAADlCAIAAAAp5CPLAAAgAElEQVR4nNS8d3cj15nuW/wq91vc8d ...

  5. appium---第三个脚本,进入评论页,发表评论

    #进入编辑页,点击编辑框,固定光标 #com.xxx.xxx:id/edit__content drive.find_element_by_id('/edit_content').click(); t ...

  6. orleans exception序列化

    options.FallbackSerializationProvider = typeof(ILBasedSerializer).GetTypeInfo();

  7. 057 Java中kafka的Producer程序实现

    1.需要启动的服务 这里启动的端口是9092. bin/kafka-console-consumer.sh --topic beifeng --zookeeper linux-hadoop01.ibe ...

  8. pip软件包安装 + Anaconda软件库安装 教程

    PIP软件包安装(适用于Ubuntu和Windows10): 下载pip的安装包,官网链接如下:https://pypi.python.org/pypi/pip 我选择了Source源的安装方式,单击 ...

  9. Raspberry 音乐播放器omxplayer安装

    首先需要安装的是omxplayer播放器的依赖的库文件: wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz tar xzf pexpect- ...

  10. Java中System类的相关应用

    1.Runtime: public class RuntimeDemo { public static void main(String[] args) { Runtime runtime=Runti ...