最近开始了阿里云CDN鉴权,看了一晚上终于看懂怎么用了TAT,在这里记录下。
CDN鉴权主要是通过设置访问URL的有效时间,来进制未经授权的访问或超过时限的访问,有助于控制CDN的访问来源。
阿里云CDN鉴权通过在url里加入时间(timestamp)和时间+访问文件的uri+key计算出的MD5等信息,来实现设置过期时间和防止url被修改。
先说说阿里云ABC三种鉴权方式的主要区别
1.鉴权方式A
URL格式: http://DomainName/Filename?auth_key=timestamp-rand-uid-md5hash ,其中timestamp是时间戳,rand是随机数,阿里云推荐用UUID,但不能包含'-',uid暂未使用,推荐用0,
时间计算方法:通过 1970年1月1日以来的当前时间秒数+过期时间秒数 来计算过期时间 也就是通过Unix时间戳计算时间,php可以通过$timestamp=time();获取时间戳。
MD5计算方法: URI-Timestamp-rand-uid-PrivateKey 的MD5(URI是用户的请求201508150800对象相对地址,不包含参数,如/Filename)
评价:
优点:控制时间的单位为秒
缺点:URL中有无用参数,且链接不是特别美观
2.鉴权方式B
URL格式: http://DomainName/timestamp/md5hash/FileName
时间计算方法:格式为: YYYYMMDDHHMM,有效时间1800s,如201508150800
MD5计算方法: 密钥+timestamp+URI 的MD5,密钥与timestamp和URI之间没有任何连接符号,如aliyuncdnexp1234201508150800/4/44/44c0909bcfc20a01afaf256ca99a8b8b.mp3,aliyuncdnexp1234为密钥,201508150800为访问时间,/4/44/44c0909bcfc20a01afaf256ca99a8b8b.mp3为URI
评价:
优点:URL比较美观
缺点:时间只能控制在分钟级别,不能精确到秒
3.鉴权方式C
URL格式:
格式1: http://DomainName/{<md5hash>/<timestamp>}/FileName
格式2: http://DomainName/FileName{&KEY1=<md5hash>&KEY2=<timestamp>}
时间计算方法:取UNIX时间表示为十六进制
MD5计算方法:密钥+URI+timestamp 的MD5,同样,密钥与timestamp和URI之间没有任何连接符号如aliyuncdnexp1234/test.flv55CE8100
评价:
优点:格式1URL比较美观,时间精确到秒
缺点:暂无(大概)
简单点说我认为鉴权方式C最好,鉴权方式A复杂,鉴权方式B不精确,还有时间问题,鉴权方式C使用起来最舒适
那么看看使用方式(PHP代码,最后的$url为授权链接)
鉴权方式A:
$domain='https://domain'; //domain更换为自己的域名,若未开启SSL将https改为http,结尾不带'/'
$uri='uri'; //URI为资源地址,例如/img/myimg.jpg
$key='key'; //key为URL鉴权设置中填写的主KEY,副KEY暂时不知道有什么用处,建议通过echo $RANDOM | md5sum来随机生成KEY
$timestamp=time()-1800+链接有效时长(秒); //这里减1800主要因为阿里云CDN的过期时间永远是设置的timestamp加上1800秒,应该是当初设计缺陷?(大概)
$uuid=md5(uniqid(mt_rand(), true));
$uid=0; //推荐用0
$md5hash=md5($uri.'-'.$timestamp.'-'.$uuid.'-'.$uid.'-'.$key);
$url=$domain.$uri.'?auth_key='.$timestamp.'-'.$uuid.'-'.$uid.'-'.$md5hash;
鉴权方式B:
$domain='https://domain';
$uri='uri';
$key='key';
date_default_timezone_set("PRC");//这里说一下...虽然阿里云客服说他们时间用的UTC时间,比北京时间少8小时...但是我用的时候用PRC才能正常鉴权...
$timestamp=date('YmdHi', strtotime('-30minute'));//这里减去30分钟是减去阿里云授权链接自带的30分钟,如要设置链接有效时间为2分钟,则应替换为-28minute
$md5hash=md5($key.$timestamp.$uri);
$url=$domain.'/'.$timestamp.'/'.$md5hash.$uri;
鉴权方式C($url_1为格式1,$url_2为格式2):
$domain='https://domain';
$uri='uri';
$key='key';
$timestamp=dechex(time()-1800+链接有效时长(秒));
$md5hash=md5($key.$uri.$timestamp);
$url_1=$domain.'/'.$md5hash.'/'.$timestamp.$uri;
$url_2=$domain.$uri.'?KEY1='.$md5hash.'&KEY2='.$timestamp';
踩到的坑&值得注意的地方:
1.这里要说一下...鉴权方式2我真的是用PRC时区才正常鉴权的,我之前按照客服说的用UTC时间折腾半天也没折腾对
2.链接的过期时间都是时间戳+1800s才过期,因此计算过期时间的时候要考虑这1800s
3.URL鉴权设置里面的副key暂时不知道有什么用,有知道的麻烦告诉我下
4.鉴权可以设置url的过期时间,因此配合服务端能限制CDN的访问次数,访问时长,紧急的时候可以停止授权,以防止因CDN产生严重亏损
那么这篇文章的内容就这么多了,如果由于文笔不好,造成理解困难请多多谅解,有看不明白/容易产生误解/错误的地方可以找我,我会进行修改(卖萌.jpg)