乐趣区

关于golang:开源服务lalserver支持多种鉴权防盗链方式

lalserver 是纯 Golang 开发的流媒体服务器。目前已反对 RTMP, RTSP(RTP/RTCP), HLS, HTTP[S]/WebSocket[S]-FLV/TS 协定。

目前已反对多种鉴权防盗链的形式。

lal github 地址:https://github.com/q191201771…

▌ 形式一. 固定值的鉴权参数

首先,批改配置文件,如下:

"conf_version": "v0.2.6",
...
"simple_auth": {
    "key": "q191201771",              // 公有 key,计算鉴权参数时应用
    "dangerous_lal_secret": "pengrl", // 后门鉴权参数,所有的流可通过该参数值鉴权
    "pub_rtmp_enable": true,          // rtmp 推流是否开启鉴权,true 为开启鉴权,false 为不开启鉴权
    "sub_rtmp_enable": true,          // rtmp 拉流是否开启鉴权
    "sub_httpflv_enable": true,       // httpflv 拉流是否开启鉴权
    "sub_httpts_enable": true,        // httpts 拉流是否开启鉴权
    "pub_rtsp_enable": true,          // rtsp 推流是否开启鉴权
    "sub_rtsp_enable": true,          // rtsp 拉流是否开启鉴权
    "hls_m3u8_enable": true           // m3u8 拉流是否开启鉴权
}
...

形式一和形式二的配置都在配置项 simple_auth 下治理:

  • pubsub 结尾的字段决定了各协定是否开启鉴权
  • dangerous_lal_secret为鉴权参数的值
  • key在上面形式二中应用,这里临时不关怀

举例,没开启鉴权性能时,推 rtmp 流的 url 是rtmp://127.0.0.1:8080/live/test110

开启后,业务方推流 url 是变为

rtmp://127.0.0.1:8080/live/test110?lal_secret=pengrl

其中 lal_secret 就是鉴权签名参数,名字是固定的,值也是固定的,对应配置文件中 dangerous_lal_secret 的值。

该鉴权形式,所有流都应用同一个鉴权参数值。

▌ 形式二. MD5 签名的鉴权参数

首先,仍然是批改配置文件(参见下面形式一中的形容):

  • pubsub 等结尾的字段决定了各协定是否开启鉴权
  • key用来做 MD5 签名

举例,没开启鉴权性能时,推 rtmp 流的 url 是rtmp://127.0.0.1:8080/live/test110

开启后,业务方推流 url 是变为

rtmp://127.0.0.1:8080/live/test110?lal_secret=700997e1595a06c9ffa60ebef79105b0

其中 lal_secret 就是鉴权签名参数,名字是固定的,值的计算公式是

md5(配置文件中的 simple_auth::key + 流名称)

下面的例子对应的计算形式是

md5("q191201771test110")

Go、c++ 代码以及命令行、网页工具如何计算 MD5 见:应用工具或代码生成 MD5 – 仁亮笔记

该鉴权模式下,不同的流名称对应不同的鉴权参数。

留神,形式一和形式二可同时应用。lal_secret的值满足任意一种计算形式即可鉴权通过。

▌ 形式三. 与业务方服务交互,自在定制鉴权形式

大体的逻辑是,lalserver 在接管到推流或者拉流申请时,应用 http 回调的形式告诉业务方的服务。

业务方的服务依据本身的逻辑,断定这个推流或者拉流申请是否非法。

如果不非法,应用 lalserver 提供的 http api 接口将该申请踢掉。

相干文档:

  • lalserver HTTP Notify 事件回调
  • lalserver HTTP API 接口

第三方文档

  • https://help.aliyun.com/docum…
  • https://cloud.tencent.com/doc…
  • https://www.wangsu.com/docume…
退出移动版