跳到主要内容

請求籤名

請求籤名方法

使用控制檯建立金鑰,獲得 AccessKeyId 和 AccessKeySecret,這裡我們做以下假設:

AccessKeyId=6792aa42d288422ab8dd4654dfe727c4
AccessKeySecret=2f59e0d79d36442a899b54136cd7dc82

下面以開通虛擬機器的 API 為例子,說明一下,如何使用構造請求的簽名 例如我們請求ch-wuxi1機房中的建立雲主機操作:

https://api.yunpanel.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)

警告:編碼時空格要轉換成 “%20” , 而不是 “+”;"*"要轉換成"%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

假設URL編碼後的字串命名為$sbParams

2.將進行過編碼的字串進行MD5

MD5的php程式碼:

md5(http_build_query($sbParams, '', '&', PHP_QUERY_RFC3986)) . "\n";

3.生成要簽名的字串

生成簽名的字串格式: 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

假設生成的簽名命名為 stringToSign

生成簽名

生成簽名規則:

  1. 使用最早獲取的 AccessKeySecret 和 HMAC-SHA256 演算法來生成簽名,詳細可以參考 RFC2104。
  2. 將以上得到的簽名字串stringToSign使用 Base64 編碼。

簽名的php程式碼:

//設定時區
date_default_timezone_set('PRC');

//所有請求引數,不包括簽名
$parameters = ['Action'=>'RunInstance', 'Name'=>'雲主機名稱', 'Date'=>date('Y-m-d\TH:i:s O')];

//自己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;
}

生成的簽名字串作為請求引數Signature

4.最終生成的請求URL如下:

https://api.yunpanel.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