棱束链对象存储服务提供 获取临时秘钥接口 不同于 S3 接口的签名方式,开发者需要单独实现计算签名 。
x-lingshulian-sign 签名计算的方法
AccessSecret = AccessId + "-" + AccessKey;
StringToSign = HTTP-Verb + "\n" +
Host + "\n" +
UrlPath + "\n" +
Body + "\n" +
Expiry_to;
Signature = AccessId + "-" + Expiry_to "-" + Base64( HMAC-SHA1( AccessSecret, StringToSign ) );
HTTP-Verb
表示 HTTP 请求的 Method,主要有 PUT,GET,POST,HEAD,DELETE 等。Host
表示请求的Url的Host 如: 请求获取临时秘钥接口 https://api.lingshulian.com/api/auth/secret
Host则为 api.lingshulian.com
。UrlPath
表示请求的Url路径,如: 请求获取临时秘钥接口 https://api.lingshulian.com/api/auth/secret
UrlPath则为 /api/auth/secret
。Body
表示此次请求的内容。Expiry_to
表示本次签名的有效期,最低不能低于现在时间戳,最大不可以超过现在时间戳960秒后 。签名示例
假如 账号主 AccessKey 是 ”7f23221b13874555a9eadcef8a761bb”,账号主 AccessSecret 是 ”f1fa4e8370962e4a79dd865f61a3f8e”
账号主 Access 可以前往 控制台 → 个人中心 → API 页面获取。
签名获取临时秘钥的 PHP 示例代码
<?php
//主账号秘钥id
$access_id = '7f23221b13874555a9eadcef8a761bb';
//主账号秘钥key
$access_key = 'f1fa4e8370962e4a79dd865f61a3f8e';
//请求url
$url = 'https://api.lingshulian.com/api/auth/secret';
//请求body
$body = [
'ttl' => 900,//获取的临时secret有效期
'policy' => [//赋予的权限
'full_control'
],
'bucket_name' => 'lingshulitest',//允许操作的桶
'prefix' => 'a/', //允许操作的前缀
'key' => ''//允许操作的Key
];
//计算签名
//请求方法
$model = 'POST';
//解析url信息
$url_info = parse_url($url);
//获取解析url的host
$host = $url_info['host'];
//获取解析url的path
$url_path = $url_info['path'];
//发送数据转换为json字符串
$body = json_encode($body);
//设置签名过期时间
$expiry_to = time() + 60;
//组合签名 AccessSecret
$sign_access_secret = $access_id . '-' . $access_key;
//组合签名字符串
$sign_string = $model . "\n" . $host . "\n" . $url_path . "\n" . $body . "\n" . $expiry_to;
//计算签名
$sign = $access_id . '-' . $expiry_to . '-' . base64_encode(hash_hmac('sha1', $sign_string, $sign_access_secret, true));
//使用curl发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json; charset=utf-8',
'x-lingshulian-sign: ' . $sign
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $httpCode;
echo $response;