RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置

鉴权验证在自建直播流媒体服务端应用中是非常重要的。用以防止非法推流,控制收费播放盗链等场景。
目前各大直播云平台都支持url参数形式的鉴权验证法,例如rtmp://serverhost/app-name/stream-name?key=md5(secret+expires_timestemp)&time=expires_timestemp 这种既有私密key,又有时间戳过期判断的最简单形式,当然还能根据使用场景增加其他判断条件。
Nginx-Rtmp模块作为rtmp直播流媒体服务端,本身没有这种鉴权验证法,但能通过Notify 转为本地的http请求,使用Nginx内置的ngx_http_secure_link_module即能达到同样效果。

首先利用Nginx-Rtmp的on_play通知,将rtmp的播放事件通知到本地的http处理上来

注意一定要将通知改为get形式

本地http处理/on_play

rtmp url的生成者负责生成一条包含key和time参数的url,并计算好过期时间。
比如原始rtmp url 是: rtmp://stream.nodemedia.cn/live/demo,生成url的时间是2016/7/24 17:00:00 时间戳即是1469350800,我们希望1分钟后这个url失效,那么失效时间戳就是1469350860,我们和服务端约定好的auth_key是”nodemedia2016″,那么按照nginx的约定先对『nodemedia20161469350860』这个拼装的字符串md5,再base64,如果有再替换”+/”为 “-_”,如果有再删除”=”(比较繁琐)

得到 ldorjTG99nd0juc88bltiQ这样的字符串,这就是key参数的值了,拼装为

rtmp://stream.nodemedia.cn/live/demo?key=ldorjTG99nd0juc88bltiQ&time=1469350860

1分钟内请求是可以正常播放的,1分钟后再请求,会直接被nginx服务器断开socket。

本方法利用Nginx-Rtmp 的开始播放的通知事件转为内部http利用内置ngx_http_secure_link_module模块达到鉴权实现。原理很简单,不过略繁琐。

在这里,本人参照网宿CDN的模式对ngx_http_secure_link_module进行了修改,增加了secure_link_extime参数,在服务器内部控制过期时间,rtmp_url的生成者只需传入当前时间戳,来隐蔽过期时间。加密部分只需一次md5,不再转base64再替换字符串那么繁琐,时间戳也采用HEX形式隐蔽。

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: RTMP流媒体服务端应用开发系列 – Nginx-Rtmp鉴权设置

1 评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据