开源流媒体服务器SRS学习笔记(3) - HTTPCallback实现安全认证
按上回继续,安全论证是绝大多数应用的基本要求,如果任何人都能无限制的发布/播放视频,显然不适合。SRS中可以通过HTTPCallback机制来实现,参考下面的配置:
... vhost __defaultVhost__ {
... # http回调
http_hooks{
enabled on;
on_connect http://192.168.7.100:9000/srs_http_call_back;
on_close http://192.168.7.100:9000/srs_http_call_back;
on_publish http://192.168.7.100:9000/srs_http_call_back;
on_unpublish http://192.168.7.100:9000/srs_http_call_back;
on_play http://192.168.7.100:9000/srs_http_call_back;
on_stop http://192.168.7.100:9000/srs_http_call_back;
on_dvr http://192.168.7.100:9000/srs_http_call_back;
on_hls http://192.168.7.100:9000/srs_http_call_back;
on_hls_notify http://192.168.7.100:9000/srs_http_call_back;
}
}
只要打开http_hooks,然后在各个事件中,配置回调的url即可。(大家可以把上面的192.168.7.100换成实际地址)
回调的http url有二个基本要求:
1、 srs服务器能正常访问该url
2、该url接受post参数,如果校验成功,http status必须返回200,同时输出0,否则视为校验失败
post参数的json格式示例如下:
{
"action": "on_connect",
"client_id": 1985,
"ip": "192.168.1.10",
"vhost": "video.test.com",
"app": "live",
"tcUrl": "rtmp://x/x?key=xxx&uid=jimmy",
"pageUrl": "http://x/x.html"
}
这里,我们用spring boot(groovy语言)实现一个最基本的on_connect安全校验(注:仅出于演示目的,只要tcUrl中包括jimmy这个字符串就算通过,实际应用中,可以从db中校验,并结合一定的加解密算法,校验有效性)
@RestController
class SrsHttpCallBack{
@RequestMapping("/srs_http_call_back")
String auth(@RequestBody CallBackRequestData data){
if (data){
println data.dump()
if (data.action=="on_connect"){
//简单示例:仅校验on_connect(校验只有jimmy这个用户,允许连接)
if (data.tcUrl!=null && data.tcUrl.indexOf("jimmy")!=-1){
//pass
return "0"
}
else{
// fail
return "-1"
}
}
}
//其它情况,返回成功
"0"
} @RequestMapping("/")
String home(){
"hello world"
}
} @groovy.transform.ToString
class CallBackRequestData{
def action
def client_id
def ip
def vhost
def app
def tcUrl
def pageUrl
def send_bytes
def recv_bytes
def stream
def file
def cmd }
随便找个编辑器(比如:vscode),把上面的代码复制进去,保存为http_call_back.groovy,然后利用springboot cli,启动:
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实现安全认证的更多相关文章
- 开源流媒体服务器SRS学习笔记(1) - 安装、推流、拉流
SRS(Simple RTMP Server) 是国人写的一款非常优秀的开源流媒体服务器软件,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群. 一.安装 官网提供了3种安 ...
- 开源流媒体服务器SRS学习笔记(2) - rtmp / http-flv / hls 协议配置 及跨域问题
对rtmp/http-flv/hls这三种协议不熟悉的同学,强烈建议先看看网友写的这篇文章科普下:理解RTMP.HttpFlv和HLS的正确姿势 . srs可以同时支持这3种协议,只要修改conf ...
- 开源流媒体服务器SRS学习笔记(4) - Cluster集群方案
单台服务器做直播,总归有单点风险,利用SRS的Forward机制 + Edge Server设计,可以很容易搭建一个大规模的高可用集群,示意图如下 源站服务器集群:origin server clus ...
- NodeJS版本EasyDarwin开源流媒体服务器开发心得
title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...
- EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布
EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...
- EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法
EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...
- 我为什么选择采用node.js来做新一代的EasyDarwin RTSP开源流媒体服务器
在去年我们还未开始开发基于node.js的新版本EasyDarwin RTSP开源流媒体服务器的时候,我写了一篇博客<对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更 ...
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...
随机推荐
- noip2012
题解: 闲着无聊做了一遍noip2012 我觉得出题出的好奇怪啊... 为什么两道倍增两道二分答案??? 两天第一题: 第一天第一题傻逼普及组题没什么好说的了 第二天第一题你会扩欧就秒了 两天第二题: ...
- COMException: The data necessary to complete this operation is not yet available.
问题描述: 最近在公司AE项目中遇到了下面的问题: COMException: The data necessary to complete this operation is not yet ava ...
- ionic2集成sdk后,连接超时的问题
这几天在测试app的时候,偶尔会发现集成的好视通sdk在进入会议室的时候出现连接超时的问题,一直卡在‘正在获取版本信息’的页面,经反复测试后这种现象主要出现在点击返回按钮和退出登录按钮的时候会出现,也 ...
- python 进阶读书笔记2 -- python魔法函数
#!/usr/bin/env python# -*- coding: utf-8 -*- class student: def __init__(self, name_list): self.stud ...
- day3.python字符串格式化
字符串格式化 注意:若在格式化输出中还需要再加%,需要两个%来代替 方法1:%控制格式化输出 例1: print("I'm %s. I'm %d year old" % ('Vam ...
- Docker数据卷和Docker系统管理(一)
一. 创建和挂载数据卷 1. 创建数据卷 (1)执行下列命令,创建一个名为my-data的数据卷 [root@c720120 ~]# docker volume create my-data my-d ...
- jquery|js|jq常用正则
var mobReg=/^1[34578]\d{9}$/; //手机号 if (!mobReg.test(mob)) { mui.alert("请填写正确手机号!"," ...
- P1330 封锁阳光大学 DFS
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 【python】常用内建模块
[datetime] No1: 获取当前时间 No2: 时区转换 >>> from datetime import datetime, timedelta, timezone > ...
- NiftyNet开源平台使用
NiftyNet是一款开源的卷积神经网络平台,专门针对医学图像处理分析,上一篇博客已经详细介绍了这个平台,接下来让我简单介绍一下目前我了解到的使用方法.更详细的使用方法.以及配置过程请查看NiftyN ...