@upyun
2017-05-20T03:18:13.000000Z
字数 2082
阅读 1038
微信文章
1.鉴权介绍
阿里云支持的三种鉴权方式:
https://help.aliyun.com/document_detail/27135.html 。 可以去阅读一下三种鉴权的介绍,我这里就不详细的展开。直接讲讲怎么使用又拍云的Rewrite规则实现A鉴权的功能。
A鉴权示例说明
通过 req_auth 请求对象:
http:// cdn.example.com/video/standard/1K.html
密钥设为:aliyuncdnexp1234 (由用户自行设置)
鉴权配置文件失效日期为:2015年10月10日00:00:00,计算出来的秒数为1444435200
则CDN服务器会构造一个用于计算Hashvalue的签名字符串:
/video/standard/1K.html-1444435200-0-0-aliyuncdnexp1234
CDN服务器会根据该签名字符串计算HashValue:
HashValue = md5sum("/video/standard/1K.html-1444435200-0-0-aliyuncdnexp1234") = 80cd3862d699b7118eed99103f2a3a4f
则请求时url为:
http://cdn.example.com/video/standard/1K.html?auth_key=1444435200-0-0-80cd3862d699b7118eed99103f2a3a4f
计算出来的HashValue与用户请求中带的 md5hash = 80cd3862d699b7118eed99103f2a3a4f 值一致,于是鉴权通过。
Rewrite规则实现说明
注意:三条规则按照顺序填写,不要勾线break。
1.第一判断URI的格式是不是符合规则,(auth_key参数里面含有三个‘-’符号) 不符合规则直接返回HTTP 403错误。
$WHEN($NOT($ALL($_GET_auth_key,$MATCH($PCALL($_GET_auth_key),'^[^-]*-[^-]+-[^-]+-[^-]*$'))))$EXIT(403)
2.第二判断请求中的时间戳 是否小于当前时间,如果小于,则认为过期失效并返回HTTP 403错误。
$CAPTURE($_GET_auth_key,'([^-]*)-([^-]+)-([^-]+)-([^-]*)') $WHEN($NOT($GT($1.1,$_TIME)))$EXIT(403)
3.使用MD5算法算出 HashValue ,再和请求中带来的 md5hash 进行比对。比对结果一致,则认为鉴权通过,返回文件。否则鉴权失败,返回HTTP 403错误。
$CAPTURE($_GET_auth_key, '([^-]*)-([^-]*)-([^-]*)-([^-]*)') $WHEN($NOT($EQ($MD5($_URI'-'$PCALL($1.1)'-'$PCALL($1.2)'-'$PCALL($1.3)'-aliyuncdnexp1234'), $1.4))) $EXIT(403)
主要函数变量使用:
| 函数和变量 | 介绍 |
|---|---|
| $PCALL($_GET_auth_key) | 保护模式下解析auth_key后面的参数 ,失败时返回空字符串 |
| $MATCH | PCRE 匹配,auth_key后面的参数是否符合实例规则 |
| $CAPTURE | 按 E2 pattern 对 E1 进行捕获,n 为当前 CAPTURE 出现的次序,m 表示匹配分组,比如其中$1.1获取的是timestamp参数 |
| $_TIME | 获取当前服务器时间,格式为 UNIX TIME |
| $GT | 数字比较,是否大于,用于校验timestamp是否大于当前时间 |
| $_URI | 请求的 URI,不包含参数 |
| $MD5 | 计算MD5值 |
| $NOT | 不成立时返回 true,这个例子里面用的比较多,可以注意一下 |
鉴权代码
<?php
$etime = time() + 600; // 授权 10 分钟后过期
$domain = 'cdn.example.com' ;
$key = 'aliyuncdnexp1234'; // 密钥设为:aliyuncdnexp1234
$path = '/play/.m3u8'; // 文件相对路径
$rand = '0'; //设置的随机数
$uid = '0'; // 设置的uid参数
$url = $path.'-'.$etime.'-'.$rand.'-'.$uid.'-'.$key; //计算MD5的字符串拼接
$sign = md5($url); //签名
$Url = $domain.$path.'?auth_key='.$etime.'-'.$rand.'-'.$uid.'-'.$sign; //访问URL
echo "访问URL是:";
echo "\n";
echo $Url;
echo "\n";
总结
通过又拍云的Rewrite规则,通过变量对URL的处理,截取。在使用函数计算MD5值,比较时间是否过期,请求中带来的 md5hash和服务端计算的MD5值是否一致,请求符合服务端的判断,认为鉴权通过,返回文件。否则鉴权失败,返回HTTP 403错误。