## **簽名URL請求**
必須向 AWS PaaS提出的API請求進行簽名,簽名信息中必須包括 AWS PaaS可以用來對請求者進行身份驗證的信息,該信息由**AWS CC的秘鑰**服務提供。
AWS PaaS云服務的所有請求已全面啟用SSL。如果您采取了私有部署,為了獲得額外的安全性,建議使用 HTTPS 安全套接字層 (SSL) 傳輸URL請求。SSL 可以加密傳輸,從而保護請求或響應,避免數據在傳輸過程中被查看、篡改。
### **URL請求的簽名過程**
簽名的目標是由開發者在API客戶端計算出系列參數組合的哈希值,將產生的信息添加到URL請求的`sig`參數。
1. 獲得秘鑰
2. 計算簽名
#### **1.獲得秘鑰**
這里介紹API請求中簽名 ( sig ) 的生成方法。簽名需要開發者先在控制臺[創建API密鑰](https://docs.awspaas.com/reference-guide/aws-paas-api-guide/http/get_secret.html),獲得訪問憑證 ( access\_key ) 和私鑰 ( secret ),這里我們假設
~~~
access_key = 'Salesforce#1'
secret = '0a799959-8327'
~~~
#### **2.計算簽名**
例如API請求參數如下(這是一個 app.install.check API):
~~~
{
"timestamp":"1439279383630",
"sig_method":"HmacMD5",
"cmd":"app.install.check",
"appId":"com.actionsoft.apps.notification",
"access_key":"Salesforce#1",
"format":"json"
}
~~~
**1\. 按參數名進行升序排列**
準備參數。范圍:cmd,access\_key,timestamp,format,sig\_method和業務參數(見API輸入參數文檔),其中不包括空值參數
排序后的參數為:
~~~
{
"access_key":"Salesforce#1",
"appId":"com.actionsoft.apps.notification",
"cmd":"app.install.check",
"format":"json",
"sig_method":"HmacMD5",
"timestamp":"1439279383630"
}
~~~
**2\. 構造簽名串**
以`secret`字符串開頭,追加排序后參數名稱和值,格式:`secret`key1value1key2value2...
應用到上述示例得到簽名串為(注意:`簽名串中間沒有空格分割`):
`0a799959-8327`access\_key`Salesforce#1`appId`com.actionsoft.apps.notification`cmd`app.install.check`format`xml`sig\_method`HmacMD5`timestamp`1439277618461`
**3\. 計算簽名**
計算被簽名串加密的簽名。
* 將API密鑰的私鑰 (secret) 作為key,生成被簽名串的 HmacMD5簽名
* 將簽名得到的16字節依次轉化為大寫的16進制字符串,如果字符串長度為1,在前補0,結果為32位字符串,例如:050CC7A1C04487EAE1197C31D28B7E37
**4\. 添加簽名**
將計算的簽名值以`sig`參數名,附加到URL請求中。一個典型的API請求如下所示
**這是一個 app.install.check 的API請求**
~~~
https://b2b.awspaas.com/openapi?timestamp=1439277618461
&sig_method=HmacMD5
&cmd=app.install.check
&appId=com.actionsoft.apps.notification
&access_key=Salesforce#1
&format=json
&sig=DE90336BEDB0C3D3FE6DEE2FF0DF11AC
~~~
## **案例(語言:PHP)**
~~~
<?php
/**
* Created by PhpStorm.
* User: liub
* Date: 2019-8-8
* Time: 8:33
* AWS OpenAPI 構建簽名及請求驗證
*/
class awsApi_util
{
static function http_api($sigArr)
{
//處理aws平臺簽名 - 公用參數
$access_key = 'php_accesskey';
$secret = 'php_secret';
//公共參數
$sigArr['timestamp'] = self::getMillisecond();
$sigArr['format'] = "json";
$sigArr['access_key'] = $access_key;
$sigArr['sig_method'] = "HmacMD5";
//按key排序
ksort($sigArr,SORT_NATURAL);
//循環構建簽名字符串
$sigStr = $secret;
foreach($sigArr as $k=>$v){
if(is_array($v)){
}
$sigStr .= $k.$v;
}
//生成HmacMD5簽名
$sig = hash_hmac('md5', $sigStr, $secret);
$sig = strtoupper($sig);
$sigArr['sig'] = $sig;
//基于curl發送請求獲取結果
//構建url
$url = "http://localhost:8088/portal/openapi?";
$urlParams=null;
foreach($sigArr as $k=>$v){
$urlParams .= "&".$k."=".urlencode($v);
}
$urlParams = ltrim($urlParams, "&");
$url = $url.$urlParams;
// 1. 初始化
$ch = curl_init();
// 2. 設置選項,包括URL
curl_setopt($ch,CURLOPT_URL,$url);
//設置CURLOPT_RETURNTRANSFER將curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
// 3. 執行并獲取HTML文檔內容
$output = curl_exec($ch);
if($output === FALSE ){
echo "CURL Error:".curl_error($ch);
}
// 4. 釋放curl句柄
curl_close($ch);
$output_info = json_decode($output, true); //json解析
return $output_info;
}
//獲取毫秒時間戳
static function getMillisecond()
{
list($microsecond , $time) = explode(' ', microtime()); //' '中間是一個空格
return (float)sprintf('%.0f',(floatval($microsecond)+floatval($time))*1000);
}
}
~~~