請求簽名
簽名Demo?
對接API時,簽名驗證部分可參考demo代碼編寫(包含java、python、php、go語言的示例)
請求簽名方法?
使(shi)用創建密鑰,獲得 AccessKeyId 和 AccessKeySecret,這里我(wo)們做以下假設(she):
AccessKeyId=6792aa42d288422ab8dd4654dfe727c4
AccessKeySecret=2f59e0d79d36442a899b54136cd7dc82
下面以開(kai)通(tong)虛(xu)擬機的 API 為(wei)例(li)子,說(shuo)明(ming)一下,如何(he)使用(yong)構造請(qing)求(qiu)的簽名 例(li)如我們請(qing)求(qiu)ch-wuxi1機房中的創建云主機操作:
//api.cn-henji.com/v2/?Action=RunInstance
&Region=cn-wuxi1
&ImageId=t-ej8hh1dex32l
&FirewallId=f-g18hh7tffy34g
&Interface.0.NetworkId=noy8hh7i9na39w
&Volumes.0.Type=normal
&Volumes.0.Size=20
&Volumes.1.Type=normal
&Volumes.1.Size=20
&InstanceType=1%E6%A0%B81G_SERIES_STANDARD
&Period=1&PayType=PREPAID
&AccessKeyId=6792aa42d288422ab8dd4654dfe727c4
&Date=2017-09-13T15%3A40%3A19%20%2B0800
&Name=%E6%B5%8B%E8%AF%95%E6%8C%89%E9%87%8Fapi
&Version=1.0
&Signature=qx5mPbG0UvLSN4wKdnfmqcB63tmKi8qQUvq52ixAAAQ%3D
1.按照url請求參數的順序(不限制順序)進行URL編碼(除Signature)?
警告:編碼時(shi)空格要轉(zhuan)換成(cheng) “%20” , 而(er)不是(shi) “+”;"*"要轉(zhuan)換成(cheng)"%2A"
Name=%E6%B5%8B%E8%AF%95%E6%8C%89%E9%87%8Fapi&ImageId=t-ej8hh1dex32l&InstanceType=1%E6%A0%B81G_SERIES_STANDARD&FirewallId=f-g18hh7tffy34g&Interface.0.NetworkId=n-oy8hh7i9na39w&Volumes.0.Type=normal&Volumes.0.Size=20&Volumes.1.Type=normal&Volumes.1.Size=20&InstanceSeries=SERIES_STANDARD&Period=1&PayType=PREPAID&Region=cn-wuxi1&AccessKeyId=6792aa42d288422ab8dd4654dfe727c4&Date=2017-09-13T15%3A40%3A19%20%2B0800&Action=RunInstance&Version=1.0&Signature=qx5mPbG0UvLSN4wKdnfmqcB63tmKi8qQUvq52ixAAAQ%3D
假(jia)設(she)URL編碼后(hou)的字符串命名為$sbParams
2.將進行過編碼的字符串進行MD5?
MD5的php代碼:
md5(http_build_query($sbParams, '', '&', PHP_QUERY_RFC3986)) . "\n";
3.生成要簽名的字符串?
生成簽名(ming)的(de)字(zi)符串(chuan)格式(shi): METHOD + "\n" + MD5(sbParams) + "\n" + ContentType + "\n" + 時間 + "\n"
說明:
- HTTP請求方式 METHOD:GET 或 POST
- ContentType 例如: application/json;charset=UTF-8
- 時間 :2016-09-02T16%3A59%3A00%20%2B0800
生成例如:
aBRnnyo3MLKiJAfxDzEE9X4NvOn%2FZZ%2BBBzHG%2FJYPKjI%3D
假設(she)生成(cheng)的簽名(ming)命名(ming)為(wei) stringToSign
生成簽名?
生成簽名規則:
- 使用最早獲取的 AccessKeySecret 和 HMAC-SHA256 算法來生成簽名,詳細可以參考 RFC2104。
- 將以上得到的簽名字符串stringToSign使用 Base64 編碼。
簽名的php代碼:
//設置時區
date_default_timezone_set('PRC');
//所有(you)請求參數,不包括簽名
$parameters = ['Action'=>'RunInstance', 'Name'=>'云主(zhu)機(ji)名稱', 'Date'=>date('Y-m-d\TH:i:s O')];
//自(zi)己accessKeySecret
$accessKeySecret = 'accessKeySecret';
$signature = compute_signature($parameters, $accessKeySecret, 'GET');
function compute_signature($parameters, $accessKeySecret, $method = 'GET')
{
$stringToSign = $method . "\n";
$stringToSign .= md5(http_build_query($parameters, '', '&', PHP_QUERY_RFC3986)) . "\n";
$stringToSign .= "application/json;charset=UTF-8\n";
$stringToSign .= rawurlencode($parameters['Date']) . "\n";
$signature = percent_encode(sign_string($stringToSign, $accessKeySecret));
return $signature;
}
function sign_string($string, $accessKeySecret)
{
return base64_encode(hash_hmac('sha256', $string, $accessKeySecret, true));
}
function percent_encode($str)
{
$res = urlencode($str);
$res = preg_replace('/\+/', '%20', $res);
$res = preg_replace('/\*/', '%2A', $res);
$res = preg_replace('/%7E/', '~', $res);
return $res;
}
生成(cheng)的簽名(ming)字符串作為請求參數(shu)Signature
4.最終生成的請求URL如下:?
//api.cn-henji.com/v2/?Action=RunInstance
&Region=cn-wuxi1
&ImageId=t-ej8hh1dex32l
&FirewallId=f-g18hh7tffy34g
&Interface.0.NetworkId=noy8hh7i9na39w
&Volumes.0.Type=normal
&Volumes.0.Size=20
&Volumes.1.Type=normal
&Volumes.1.Size=20
&InstanceType=1%E6%A0%B81G_SERIES_STANDARD
&Period=1&PayType=PREPAID
&AccessKeyId=6792aa42d288422ab8dd4654dfe727c4
&Date=2017-09-13T15%3A40%3A19%20%2B0800
&Name=%E6%B5%8B%E8%AF%95%E6%8C%89%E9%87%8Fapi
&Version=1.0
&Signature=qx5mPbG0UvLSN4wKdnfmqcB63tmKi8qQUvq52ixAAAQ%3D