URL鉴权功能主要用于保护用户站点资源不被非法站点下载盗用。本文介绍阿里云CDN提供的鉴权方式A的原理和示例说明。
原理说明
鉴权方式A加密URL构成
http://DomainName/Filename?auth_key={<timestamp>-rand-uid-<md5hash>}
说明{}
中的内容表示在标准URL基础上添加的加密信息。鉴权字段说明
字段
描述
DomainName
CDN站点的域名。
Filename
实际回源访问的URL,鉴权时Filename需以正斜线(
/
)开头。auth_key
您设定的鉴权密钥。
timestamp
签算服务器生成鉴权URL的时间,与鉴权URL有效时长共同控制鉴权URL的失效时间。时间点取自签算服务器的Unix时间戳(从1970年01月01日00时00分00秒到现在的总秒数,固定长度为10)。
说明多数情况下,鉴权URL的有效时长为CDN配置有效时长。有时在签算增加鉴权URL的有效时长的,此时,timestamp=Unix时间戳+增加的时长;鉴权URL实际有效时长=timestamp+CDN配置的时长。
rand
随机数。建议使用UUID,不能包含中划线(-),例如:477b3bbc253f467b8def6711128c7bec。
uid
用户ID,暂未使用,设置成0即可。
md5hash
通过MD5算法计算出的32位字符串,由数字和小写字母组成。
计算方法:
sstring = "URI-Timestamp-rand-uid-PrivateKey"(URI是用户的请求对象相对地址,不包含参数,如/Filename) md5hash = md5sum(sstring)
鉴权逻辑说明
CDN服务器接到资源访问请求后,判断
timestamp
+鉴权URL有效时长
是否小于当前时间。如果
timestamp
+鉴权URL有效时长
小于当前时间,服务器判定过期失效,并返回HTTP 403错误。如果
timestamp
+鉴权URL有效时长
大于当前时间,则以sstring
方式构造出一个字符串(参考表格中sstring
构造方式),然后使用MD5算法算出md5hash
的值,再将计算出的md5hash
值与用户访问请求中携带的md5hash
的值进行比对。结果一致,鉴权通过,返回资源请求。
说明当鉴权通过时,会去掉URL中与鉴权相关的那部分参数,可以提高缓存命中率,减少回源流量:
实际生成缓存key的URL格式:
http://DomainName/FileName
实际回源的URL格式:
http://DomainName/FileName
结果不一致,鉴权失败,返回HTTP 403错误。
鉴权URL示例
以下示例说明鉴权方式A的实现。
示例条件
回源请求对象:
http://domain.example.com/video/standard/test.mp4
说明如果您的回源请求对象中有中文汉字,请先对其进行URL转码(即Encode),再进行鉴权URL的拼接。
原始URL:
https://example.com/image/阿里云.jpg
编码后的URL:
https://example.com/image/%E9%98%BF%E9%87%8C%E4%BA%91.jpg
设置密钥为:aliyuncdnexp1234。
签算服务器生成鉴权URL的时间:2015年10月10日08:00:00(UTC+8),转换为十进制的整型数值为1444435200。
拼接流程
CDN服务器构造出一个用于计算
md5hash
的签名字符串。/video/standard/test.mp4-1444435200-0-0-aliyuncdnexp1234
根据该签名字符串,CDN服务器计算出
md5hash
。md5hash = md5sum("/video/standard/test.mp4-1444435200-0-0-aliyuncdnexp1234") = 23bf85053008f5c0e791667a313e28ce
生成鉴权URL。
http://domain.example.com/video/standard/test.mp4?auth_key=1444435200-0-0-23bf85053008f5c0e791667a313e28ce
当使用客户端提供的加密URL进行访问时,如果CDN服务器计算出来的md5hash
值与访问请求中带的md5hash
值相同,都为23bf85053008f5c0e791667a313e28ce,并且鉴权URL在有效期内,则鉴权通过,反之鉴权失败。