URL鉴权功能旨在保护用户上传到视频直播的内容资源不被非法站点下载盗用,可通过控制台配置。本文介绍URL鉴权、原理、使用方式和注意事项。

背景

一般情况下,通过配置访问Referer黑名单和白名单来实现对访客身份的识别和过滤,保护站点资源,可以解决部分盗链问题。但由于Referer内容可以伪造,采用URL鉴权方式保护用户源站资源更为安全有效。

使用方法

  • 控制台:URL鉴权支持默认鉴权和自定义鉴权两种方式。
    • 默认鉴权:默认为A方式。详细信息请参见地址生成器
    • 自定义鉴权:如不采用默认配置可自定义配置,具体操作,请参见配置URL鉴权
    注意
    • 可通过控制台配置URL鉴权自定义主KEY和副KEY,两者拥有同样的效力,副KEY主要用于平滑更换。
    • 若主KEY执行更换,所有使用主KEY生成的播放地址会立即失效。副KEY作为主KEY更换时,使用主KEY的播放地址不会马上中断,副KEY可以继续替代主KEY提供服务。
    • 设置目标域名下URL地址的全局默认有效时长后,可对单个URL定制有效时长。此时视频直播会在timestamp后追加设置的默认有效时长。
  • 代码拼接鉴权URL。
    1. 根据推流地址指定的AppName及StreamName得到未鉴权的播流地址,如rtmp:/DomainName/AppName/StreamName
    2. 根据鉴权算法,填入对应的播流地址计算鉴权URL,鉴权组成及算法请参见下表鉴权URL组成。获取鉴权URL的代码示例,请参见鉴权代码示例

鉴权URL组成

鉴权URL适用于PC端、移动端、第三方推流和播放工具。由直播推流地址或播放地址+鉴权串组成,示例如下:
rtmp://DomainName/AppName/StreamName?auth_key=timestamp-rand-uid-md5hash
鉴权URL 描述
rtmp://DomainName/AppName/StreamName 直播推流地址或播流地址,更多信息,请参见推流地址和播放地址
auth_key=timestamp-rand-uid-md5hash 鉴权串,包含timestamp、rand、uid、md5hash4个字段,字段描述如下。
timestamp 生成鉴权URL的时间,与鉴权URL有效时长共同控制鉴权URL的失效时间。使用UNIX时间戳表示(单位:秒)。
  • 若使用控制台的地址生成器生成:timestamp=生成鉴权URL的时间。
  • 若使用控制台的访问控制 > URL鉴权生成:timestamp(失效时间)=生成鉴权URL的时间+有效时间
  • 若使用代码拼接:您可以自己定义timestamp。以Python为例:timestamp(失效时间) = int(time.time()) + 1 * 3600
rand 随机数,一般为0。

如要确保每次生成的URL不同,建议使用UUID格式,不能包含中划线(-),如:477b3bbc253f467b8def6711128c7****

uid 附加参数,暂未使用,一般为0。
md5hash 通过md5算法计算出的验证串。数字和小写英文字母混合0~9、a~z,固定长度32。
sstring = "URI-timestamp-rand-uid-PrivateKey" 
md5hash = md5sum(sstring)
  • URI:用户请求对象相对地址,即原始URL中的/AppName/StreamName,其中StreamName包含扩展名。

    生成FLV播放地址时,URI为/AppName/StreamName.flv

    生成HLS播放地址时,URI为/AppName/StreamName.m3u8

    生成FLV转码播放地址时,URI为/AppName/StreamName_ID.flv

    生成HLS转码播放地址时,URI为/AppName/StreamName_ID.m3u8

  • PrivateKey:控制台配置的主KEY或副KEY,二者皆可。
  • md5sum:表示计算MD5值,请使用开发语言对应的函数。
说明 使用控制台生成鉴权URL和使用代码拼接鉴权URL的md5hash值计算方法相同。

功能原理

当开启URL鉴权功能后,服务器获取请求后会进行如下验证:

  1. 判断请求中的失效时间是否小于当前时间。
    • 如果小于,则认为过期失效并返回HTTP 403错误。
    • 如果大于当前时间,则构造出一个同样的字符串(参见下文sstring构造方式)。
  2. 使用MD5算法算出HashValue,再和请求中带来的md5hash进行比对。
    • 比对结果一致,则认为鉴权通过,返回直播流。
    • 否则鉴权失败,返回HTTP 403错误。
HashValue是通过以下字符串计算出来的:
sstring = "URI-timestamp-rand-uid-PrivateKey"
HashValue = md5sum(sstring)
示例说明
  • 假设情况:
    1. 通过req_auth请求对象,rtmp://demo.aliyundoc.com/video/standard****
    2. 鉴权KEY设置为:aliyunliveexp1234(控制台设置的主KEY或副KEY,由用户自行设置)。
    3. 生成鉴权URL时间为:北京时间2021年05月28日16:49:57。
    4. 控制台中,鉴权URL设置的有效时长为20分钟,生成鉴权URL时配置的有效时间为40分钟。
    5. rand和uid字段都设置为0。
  • 则:
    1. 计算出来的鉴权URL的Unix时间戳为1622194197(北京时间2021年05月28日17:29:57)。
    2. 服务器会构造一个用于计算Hashvalue的签名字符串。

      /video/standard****-1622194197-0-0-aliyunliveexp1234

    3. 服务器会根据该签名字符串计算HashValue。

      HashValue = md5sum("/video/standard-1622194197-0-0-aliyunliveexp1234") = 5552ff52b5e4e20387c6dc18afce****

    4. 请求时URL为rtmp://demo.aliyundoc.com/video/standard****?auth_key=1622194197-0-0-5552ff52b5e4e20387c6dc18afce****
      说明 auth_key即为鉴权URL所带的鉴权信息。
    5. 计算出来的HashValue与用户请求中带的md5hash = 5552ff52b5e4e20387c6dc18afce****值一致,于是鉴权通过。

注意事项

  • 鉴权功能默认为开启状态,建议您保持默认开启状态,否则会出现直播被盗录、盗播的风险。如果您想要关闭鉴权功能,需要了解盗刷风险并在控制台URL鉴权页面签署《直播服务关闭URL鉴权免责协议》。
  • 鉴权功能默认为开启状态,但是配置鉴权auth_key参数必须需要业务端根据鉴权原理自行实现,暂时没有提供API接口计算鉴权auth_key参数。
  • 开启鉴权后推流或播流地址均需要添加鉴权auth_key参数才可正常播放。暂时不支持仅推流或者播流一个地址开启鉴权的功能。
  • 鉴权URL提供的是过期时间戳的限制,即在该时间段内该地址可以一直访问,不会有任何限制,鉴权还无法实现设置某个URL仅能够一次访问的功能。
  • 鉴权auth_key参数是根据去掉queryString后的URI计算MD5值后拼接得到的,参见前述设置鉴权参数小节。因此,推流和播流地址的URI均为AppName/StreamName;这样会导致推流和播流地址的鉴权auth_key参数其实是一致的。建议用户业务逻辑中如果推流地址有泄漏的情况下设置过期时间戳在业务许可范围内尽量短一些,避免播流地址被恶意访问。
  • 针对RTMP、FLV、RTS格式的推播流地址鉴权仅会在推流或者播流开始的时候进行验证,在推流或者播流过程中不会验证,即推流或者播流过程中如果超过了鉴权时间戳也可以继续播放。
  • 针对M3U8格式的播流地址鉴权会在播流开始以及播流过程中进行验证,即在播流过程中如果超过了鉴权时间戳,M3U8格式的播流地址将不能正常播放。