URL鉴权功能主要用于保护用户站点资源不被非法站点下载盗用。阿里云CDN为您提供了三种鉴权方式,本文为您详细介绍鉴权方式A的原理和示例说明。

鉴权流程

  • CDN开启URL鉴权:鉴权通过后,会去掉客户端发起的请求URL中的鉴权参数,把客户端发起的请求URL(带鉴权参数)还原为原始URL,然后使用原始URL来生成缓存key或者发起回源请求。开启
  • CDN关闭URL鉴权:CDN关闭URL鉴权,与此同时,客户端上发起的请求URL里面也要去掉鉴权参数,否则,如果CDN上的URL鉴权功能已经关闭了,但是客户端发起的请求URL里面依然携带鉴权参数的话,就会导致CDN无法把客户端发起的请求URL(带鉴权参数)还原为原始URL,最终所有请求都无法命中缓存,均会透传回源站,导致源站的流量大涨,同时也会增加源站的流量费用。关闭

原理说明

访问加密URL构成:
http://DomainName/Filename?auth_key=timestamp-rand-uid-md5hash
当鉴权通过时,会去掉URL中与鉴权相关的那部分参数(提高缓存命中率,减少回源流量):
  • 实际生成缓存key的URL格式:
    http://DomainName/FileName
  • 实际回源的URL格式:
    http://DomainName/FileName
鉴权字段描述如下表所示。
字段 描述
DomainName CDN站点的域名。
Filename 实际回源访问的URL,鉴权时Filename需以正斜线(/)开头。
auth_key 您设定的鉴权密钥。
timestamp 服务器端返回数据的时间,即应用服务端生成URL链接的时间。时间点取的是服务器端的时间(UTC时间),需要转换为十进制整型正数,固定长度为10,用来控制鉴权URL的失效时间。鉴权Key有效时间由用户在CDN控制台上设置,如果设置为1800s,您访问CDN的时间超过timestamp+1800s后,该鉴权URL失效。

例如,服务器端返回数据的时间为2020-08-15 15:00:00,则链接的真正失效时间为2020-08-15 15:30:00。

rand 随机数。建议使用UUID,不能包含中划线(-),例如:477b3bbc253f467b8def6711128c7bec。
uid 用户ID,暂未使用,设置成0即可。
md5hash 通过MD5算法计算出的字符串,由数字0~9和小写英文字母a~z混合组成,固定长度为32。
CDN服务器接到资源访问请求后,判断最终生成鉴权URL请求中的timestamp+鉴权key的有效时间是否小于当前时间。
  • 如果timestamp+鉴权key的有效时间小于当前时间,服务器判定过期失效,并返回HTTP 403错误。
  • 如果timestamp+鉴权key的有效时间大于当前时间,构造出一个同样的字符串,参考下方sstring字符串,然后使用MD5算法算出HashValue的值,再与请求中md5hash的值进行比对。
    • 结果一致,鉴权通过,返回资源请求。
    • 结果不一致,鉴权失败,返回HTTP 403错误。
    HashValue的值通过以下字符串计算得到。
    sstring = "URI-Timestamp-rand-uid-PrivateKey"(URI是用户的请求对象相对地址,不包含参数,如/Filename)
    HashValue = md5sum(sstring)

示例说明

通过以下示例说明,您可以准确理解鉴权方式A的实现方式。
  1. 回源请求对象。
    http://cdn.example.com/video/standard/test.mp4
  2. 设置密钥为:aliyuncdnexp1234。
  3. 服务器端返回数据的时间戳Timestamp为2015年10月10日00:00:00,转换为十进制的整形数值为1444435200。
  4. CDN服务器会构造一个用于计算Hashvalue的签名字符串。
    /video/standard/test.mp4-1444435200-0-0-aliyuncdnexp1234
  5. 根据该签名字符串,CDN服务器会计算出Hashvalue
    HashValue = md5sum("/video/standard/1K.html-1444435200-0-0-aliyuncdnexp1234") = 80cd3862d699b7118eed99103f2a3a4f
  6. 生成加密URL链接。
    说明 如果您的加密URL中有中文汉字,请先对其进行URL转码(即Encode),然后再执行该步骤。
    http://cdn.example.com/video/standard/test.mp4?auth_key=1444435200-0-0-80cd3862d699b7118eed99103f2a3a4f

如果计算出来的HashValue值与请求中带的md5hash值相同,都为80cd3862d699b7118eed99103f2a3a4f,则鉴权通过,反之鉴权失败。