计算签名

2023-02-19 18:15:36

计算签名

棱束链对象存储服务提供 获取临时秘钥接口 不同于 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 ) );
  1. HTTP-Verb 表示 HTTP 请求的 Method,主要有 PUT,GET,POST,HEAD,DELETE 等。
  2. Host 表示请求的Url的Host 如: 请求获取临时秘钥接口 https://api.lingshulian.com/api/auth/secret Host则为 api.lingshulian.com
  3. UrlPath 表示请求的Url路径,如: 请求获取临时秘钥接口 https://api.lingshulian.com/api/auth/secret UrlPath则为 /api/auth/secret
  4. Body 表示此次请求的内容。
  5. 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;