URL鉴权功能旨在保护用户上传到视频直播的内容资源不被非法站点下载盗用,可通过控制台配置。本文介绍URL鉴权、原理和使用方式和注意事项。
背景
一般情况下,通过配置访问Referer黑名单和白名单来实现对访客身份的识别和过滤,保护站点资源,可以解决部分盗链问题。但由于Referer内容可以伪造,采用URL鉴权方式保护用户源站资源更为安全有效。
功能简介
URL鉴权功能是通过阿里云视频直播加速节点与客户资源站点配合实现的一种更为安全可靠的源站资源防盗方法。
- 由客户站点提供给用户加密URL(包含权限验证信息)。
- 用户使用加密后的URL向加速节点发起请求。
- 加速节点对加密URL中的权限信息进行验证以判断请求的合法性,对合法请求给予正常响应,拒绝非法请求,从而有效保护客户站点资源。
适用场景
视频直播的推流端和播流端均提供了地址供用户操作,但该地址为公网地址,即在没有配置安全控制时任何人获知该地址后均可操作。这就导致该地址可能被恶意盗用而导致用户大量计费的情况。
另外,直播域名的跨域文件crossdomain.xml
默认配置的所有域名均可跨域访问(配置如下)。因此,为了对推流、播流地址进行安全限制,您可以通过设置鉴权功能的过期时间戳。
<!--播流域名crossdomain.xml内容-->
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
鉴权URL
鉴权URL适用于PC端、移动端、第三方推流和播放工具。由直播推流地址或播流地址+鉴权串
组成,示例如下:
rtmp://DomainName/AppName/StreamName?auth_key=timestamp-rand-uid-md5hash
- 直播推流地址或播流地址:
rtmp:/DomainName/AppName/StreamName
。更多信息,请参见推流地址和播放地址。 - 鉴权串:
auth_key=timestamp-rand-uid-md5hash
,其中md5hash
根据鉴权KEY+失效时间通过md5算法计算出。具有时效性。- 鉴权KEY:字段随机分配,也支持用户自定义,鉴权KEY本身不会过期。
- 失效时间:指用户访问客户源服务器时间超过自定义的时间(timestamp字段指定)后,该鉴权失效。
例如,控制台上设置的有效时间为1800s,用户设置访问时间:2020-08-15 15:00:00,链接真正失效时间是:2020-08-15 15:30:00。
timestamp、rand、uid、md5hash的字段描述如下:
字段 描述 timestamp URL失效时间戳。为Unix时间戳,格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。 若控制台配置了有效时间为30分钟,该有效时间表示该鉴权URL会在用户定义的过期时间戳的30分钟后实现
示例:指定timestamp为1597474800(即2020-08-15 15:00:00),同时在控制台设置的有效时间为30分钟(1800秒),则链接真正失效时间是2020-08-15 15:30:00。
rand 随机数,一般为0。 如要确保每次生成的URL不同,建议使用UUID格式,不能包含中划线(-),如:
477b3bbc253f467b8def6711128c7bec
。uid 附加参数,暂未使用,一般为0。 md5hash 通过md5算法计算出的验证串。数字和小写英文字母混合0-9、a-z,固定长度32。 - URI:请求文件的相对地址,不包含参数,如/AppName/StreamName。
- PrivateKey:控制台配置的主KEY或副KEY,二者皆可。
- md5sum:表示计算MD5值,请使用开发语言对应的函数。
sstring = "URI-timestamp-rand-uid-PrivateKey" md5hash = md5sum(sstring)
功能原理
当开启URL鉴权功能后,服务器获取请求后会进行如下验证:
- 判断请求中的timestamp是否小于当前时间。
- 如果小于,则认为过期失效并返回HTTP 403错误。
- 如果timestamp大于当前时间,则构造出一个同样的字符串(参见下文sstring构造方式)。
- 使用MD5算法算出HashValue,再和请求中带来的md5hash进行比对。
- 比对结果一致,则认为鉴权通过,返回直播流。
- 否则鉴权失败,返回HTTP 403错误。
sstring = "URI-Timestamp-rand-uid-PrivateKey"(URI是用户的请求对象相对地址,不包含参数,如:/AppName/StreamName)
HashValue = md5sum(sstring)
- 假设情况:
- 通过 req_auth 请求对象。
rtmp://live.example.com/video/standard/1K.html
- 鉴权KEY设置为:aliyunliveexp1234(控制台设置的主KEY或副KEY,由用户自行设置)。
- 鉴权URL指定失效时间为:北京时间2015年10月10日08:00:00。
- rand和uid字段都设置为0。
- 通过 req_auth 请求对象。
- 则:
- 计算出来的鉴权URL指定失效时间的Unix时间戳为1444435200。
- 服务器会构造一个用于计算Hashvalue的签名字符串。
/video/standard/1K.html-1444435200-0-0-aliyunliveexp1234
- 服务器会根据该签名字符串计算HashValue。
HashValue = md5sum("/video/standard//1K.html-1444435200-0-0-aliyunliveexp1234") = 80cd3862d699b7118eed99103f2a3a4f
- 请求时URL为
rtmp://live.example.com/video/standard/1K.html?auth_key=1444435200-0-0-80cd3862d699b7118eed99103f2a3a4f
说明 auth_key即为鉴权URL所带的鉴权信息。 - 计算出来的HashValue与用户请求中带的
md5hash = 80cd3862d699b7118eed99103f2a3a4f
值一致,于是鉴权通过。
使用方法
- 开启URL鉴权后,阿里云视频直播的播放器SDK,以及获取播流地址的API/SDK都会自动生成带时效的播流URL。
- 主KEY和副KEY拥有同样的效力,副KEY主要用于平滑更换。
若主KEY执行更换,所有使用主KEY生成的播放地址会立即失效。副KEY作为主KEY更换时,使用主KEY的播放地址不会马上中断,副KEY可以继续替代主KEY提供服务。
- 设置目标域名下URL地址的全局默认有效时长后,可对单个URL定制有效时长。
说明 此时视频直播会在timestamp后追加设置的默认有效时长。
您还可以通过代码获取鉴权URL。
鉴权算法请参见鉴权URL,根据推流地址指定的AppName及StreamName得到未鉴权的播流地址,如rtmp:/DomainName/AppName/StreamName
;再根据鉴权算法代码实现,填入对应的播流地址计算鉴权URL。
获取鉴权URL的代码示例,请参见鉴权代码示例。
注意事项
- 鉴权功能默认为开启状态,建议您保持默认开启状态,否则会出现直播被盗录、盗播的风险。如果您想要关闭鉴权功能,需要了解盗刷风险并在控制台URL鉴权页面签署《直播服务关闭URL鉴权免责协议》。
- 鉴权功能默认为开启状态,但是配置鉴权auth_key参数必须需要业务端根据鉴权原理自行实现,暂时没有提供API接口计算鉴权auth_key参数。
- 开启鉴权后推流或播流地址均需要添加鉴权auth_key参数才可正常播放。暂时不支持仅推流或者播流一个地址开启鉴权的功能。
- 鉴权URL提供的是过期时间戳的限制,即在该时间段内该地址可以一直访问,不会有任何限制,鉴权还无法实现设置某个URL仅能够一次访问的功能。
- 鉴权auth_key参数是根据去掉queryString后的URI计算MD5值后拼接得到的,参见前述设置鉴权参数小节。因此,推流和播流地址的URI均为AppName/StreamName;这样会导致推流和播流地址的鉴权auth_key参数其实是一致的。建议用户业务逻辑中如果推流地址有泄漏的情况下设置过期时间戳在业务许可范围内尽量短一些,避免播流地址被恶意访问。
- 鉴权仅会在推流或者播流开始的时候进行验证,在推流或者播流过程中即不会验证,也就是说推流或者播流过程中如果超过了鉴权时间戳也可以继续播放。