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

背景

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

功能简介

URL鉴权功能是通过阿里云视频直播加速节点与客户资源站点配合实现的一种更为安全可靠的源站资源防盗方法。

  1. 由客户站点提供给用户加密URL(包含权限验证信息,URL组成请参见鉴权URL)。
  2. 用户使用加密后的URL向加速节点发起请求。
  3. 加速节点对加密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:鉴权串,包含timestamp、rand、uid、md5hash4个字段。

    timestamp、rand、uid、md5hash的字段描述如下:

    字段 描述
    timestamp URL时间戳,是此鉴权URL生效的时间。为Unix时间戳,格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
    • 若使用控制台的地址生成器生成:timestamp=生成链接的时间。
    • 若使用控制台的访问控制 > URL鉴权生成:timestamp=生成链接的时间+有效时间
    • 若使用代码拼接:您可以自己定义timestamp。以Python为例:timestamp = int(time.time()) + 1 * 3600
    说明 timestamp表示鉴权URL生效的时间。

    鉴权URL失效时间为timestamp+有效时长,有效时长是控制台的访问控制 > URL鉴权中设置的。

    rand 随机数,一般为0。

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

    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. 判断请求中的失效时间(timestamp+有效时长)是否小于当前时间。
    • 如果小于,则认为过期失效并返回HTTP 403错误。
    • 如果大于当前时间,则构造出一个同样的字符串(参见下文sstring构造方式)。
  2. 使用MD5算法算出HashValue,再和请求中带来的md5hash进行比对。
    • 比对结果一致,则认为鉴权通过,返回直播流。
    • 否则鉴权失败,返回HTTP 403错误。
HashValue是通过以下字符串计算出来的:
sstring = "URI-timestamp-rand-uid-PrivateKey"
HashValue = md5sum(sstring)
示例说明
  • 假设情况:
    1. 通过req_auth请求对象。rtmp://live.example.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") = 5552ff52b5e4e20387c6dc18afce206b

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