为防止站点资源被恶意下载盗用,除了通过配置访问Referer黑名单和白名单来实现对访客身份的识别和过滤,您还可以使用URL鉴权功能对推播流地址进行鉴权,更安全有效地保护用户源站资源。本文介绍URL鉴权的使用方式,原理、和注意事项。
鉴权URL组成
鉴权URL适用于PC端、移动端、第三方推流和播放工具。由直播推流地址或播放地址+鉴权串组成,示例如下:
rtmp://push.aliyundoc.com/app/stream?auth_key=1740562218-0-0-183e22e*********参数auth_key即鉴权串。
鉴权串结构
timestamp-rand-uid-md5hash- timestamp:UNIX时间戳,单位秒,最终失效时间由该值加上域名URL鉴权有效时长决定。 - 使用控制台直播地址生成器生成地址时,timestamp默认为当前时间。即使用直播地址生成器生成地址时,有效期为:当前时间+域名URL鉴权有效时长。 - 通过代码自定义生成地址时,可以指定timestamp。比如您设置timestamp为:当前时间+3600秒,那最终失效时间为:当前时间+3600秒+域名URL鉴权有效时长。如果设置timestamp为:当前时间,那最终失效时间为:当前时间+域名URL鉴权有效时长。 
- rand:随机数,一般为0。 - 如要确保每次生成的URL不同,建议使用UUID格式,不能包含中划线(-),如: - 477b3bbc253f467b8def6711128c7****。
- uid:附加参数,暂未使用,一般为0。 
- md5hash:通过md5算法计算出的验证串。数字和小写英文字母混合0~9、a~z,固定长度32。 - 加密内容: - sstring = "URI-timestamp-rand-uid-PrivateKey" md5hash = md5sum(sstring)- 比如推流地址: - rtmp://push.aliyundoc.com/app/stream,加密内容为:- /app/stream-timestamp-rand-uid-域名鉴权Key。
使用方法
使用鉴权URL,需要推/播流域名开启URL鉴权功能(域名初次添加时,默认已开启URL鉴权,相关配置可参见URL鉴权配置)。鉴权URL可通过直播地址生成器或代码自定义生成,具体信息,可参见生成推流地址和播放地址。
功能原理
当开启URL鉴权功能后,服务器获取请求后会进行如下验证:
- 判断请求中的失效时间是否小于当前时间。 - 如果小于当前时间,则认为过期失效并返回HTTP 403错误。 
- 如果大于当前时间,则构造出一个同样的字符串(参见下文sstring构造方式)。 
 
- 使用MD5算法算出HashValue,再和请求中带来的md5hash进行比对。 - 比对结果一致,则认为鉴权通过,返回直播流。 
- 否则鉴权失败,返回HTTP 403错误。 
 
HashValue是通过以下字符串计算出来的:
sstring = "URI-timestamp-rand-uid-PrivateKey"
HashValue = md5sum(sstring)示例说明
- 假设情况: - 通过req_auth请求对象, - rtmp://demo.aliyundoc.com/video/standard****。
- 鉴权KEY设置为:aliyunliveexp1234(控制台设置的主KEY或副KEY,由用户自行设置)。 
- 生成鉴权URL时间为:北京时间2021年05月28日16:49:57。 
- 控制台中,鉴权URL设置的有效时长为40分钟。 
- rand和uid字段都设置为0。 
 
- 则: - 计算出来的鉴权URL的Unix时间戳为1622194197(北京时间2021年05月28日17:29:57)。 
- 服务器会构造一个用于计算Hashvalue的签名字符串。 - /video/standard-1622194197-0-0-aliyunliveexp1234
- 服务器会根据该签名字符串计算HashValue。 - HashValue = md5sum("/video/standard-1622194197-0-0-aliyunliveexp1234") = 5552ff52b5e4e20387c6dc18afce****
- 请求时URL为 - rtmp://demo.aliyundoc.com/video/standard****?auth_key=1622194197-0-0-5552ff52b5e4e20387c6dc18afce****说明- auth_key即为鉴权URL所带的鉴权信息。 
- 计算出来的HashValue与用户请求中带的 - md5hash = 5552ff52b5e4e20387c6dc18afce****值一致,于是鉴权通过。
 
注意事项
- 鉴权功能默认为开启状态,建议您保持默认开启状态,否则会出现直播被盗录、盗播的风险。如果您想要关闭鉴权功能,需要了解盗刷风险并在控制台URL鉴权页面签署《关闭URL鉴权免责协议》。 
- 鉴权功能默认为开启状态,但是配置鉴权auth_key参数必须需要业务端根据鉴权原理自行实现,暂时没有提供API接口计算鉴权auth_key参数。 
- 开启鉴权后推流或播流地址均需要添加鉴权auth_key参数才可正常播放。暂时不支持仅推流或者播流一个地址开启鉴权的功能。 
- 鉴权URL提供的是过期时间戳的限制,即在该时间段内该地址可以一直访问,不会有任何限制,鉴权还无法实现设置某个URL仅能够一次访问的功能。 
- 鉴权auth_key参数是根据去掉queryString后的URI计算MD5值后拼接得到的,参见前述设置鉴权参数小节。因此,推流和播流地址的URI均为AppName/StreamName。建议用户业务逻辑中如果推流地址有泄漏的情况下设置过期时间戳在业务许可范围内尽量短一些,避免播流地址被恶意访问。 
- 针对RTMP、FLV、RTS格式的推播流地址鉴权仅会在推流或者播流开始的时候进行验证,在推流或者播流过程中不会验证,即推流或者播流过程中如果超过了鉴权时间戳也可以继续播放。 
- 针对M3U8格式的播流地址鉴权会在播流开始以及播流过程中进行验证,即在播流过程中如果超过了鉴权时间戳,M3U8格式的播流地址将不能正常播放。 
- 若您需要动态控制URL鉴权设置有效期的话,可通过相关SDK,以动态传入AppName和StreamName的方式进行控制,并参考相关链接鉴权代码示例。