## **簽名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);
}
}
~~~
- OpenAPI使用方法
- API調用案例
- 使用Java客戶端
- 使用其他語言(簽名URL請求)
- 組織機構接口
- 單位
- 新建單位
- 更新一個單位信息
- 注銷單位,注銷后不在顯示該單位及單位下的部門和人員
- 激活注銷的單位
- 獲得一個單位對象(根據單位id)
- 獲得單位列表
- 刪除單位
- 獲得用戶所有兼職單位(單用戶)
- 獲取用戶所有兼職單位(多用戶)
- 獲得一個單位對象(根據賬戶)
- 判斷某用戶對于某單位是否有AC權限
- 獲取指定單位層級下的部門
- 部門
- 按部門查詢用戶對象
- 獲取部門下兼職的用戶對象
- 按部門查詢用戶對象(包含兼職)
- 獲取部門下用戶數
- 按部門查詢有管理者身份的人
- 是否有部門管理者身份
- 獲得部門兼任列表
- 新建部門
- 獲得指定部門所在的行政區域劃分,若果當前部門沒有設定則自動向上尋找
- 合并指定部門到另一個部門
- 合并多個部門到目標部門(注意,僅合并指定的源部門,不包含子部門)
- 移動一個部門位置到單位下(id不變),該部門下的子部門layer也會級聯改變
- 移動一個部門位置(id不變),該部門下的子部門layer也會級聯改變
- 獲得部門對象
- 是否存在子部門
- 獲得指定部門的下級部門
- 獲得一個部門對象
- 更新部門
- 注銷部門,注銷后不在顯示該部門及子部門和人信息
- 激活注銷的部門
- 刪除部門
- 賬戶
- 獲得一個用戶對象
- 通過id獲得一個用戶對象
- 將可能含有賬戶別名的字符串處理成合法的登錄賬戶名
- 將可能含有多個賬戶別名的字符串處理成合法的登錄賬戶名字符串
- 將可能含有多個賬戶別名的字符串處理成用戶對象
- 將一組AWS登錄賬戶轉換成友好的賬戶別名
- 通過split將一組AWS登錄賬戶(或含有別名的賬戶)轉換成姓名
- 將一組AWS登錄賬戶(或含有別名的賬戶)轉換成姓名
- 檢查一組AWS登錄賬戶合法性,將不合法的賬戶返回
- 在uid所能訪問的所有賬戶范圍中搜索用戶,返回匹配登錄名、姓名或姓名拼音首字母結果
- 創建賬戶
- 更新一個賬戶屬性
- 注銷賬戶
- 激活賬戶
- 刪除賬戶(根據賬號)
- 賬戶移動部門
- 設置管理者身份
- 初始化用戶密碼
- 重設用戶密碼
- 刪除用戶(根據uniqueid)
- 更新用戶角色
- 取消管理者身份
- 創建一個賬戶兼任信息
- 查詢用戶兼任列表
- 刪除兼任
- 根據用戶姓名和手機獲取用戶對象
- 角色
- 按角色查詢用戶對象
- 按角色查詢用戶對象,包含兼職到參數指定的角色用戶
- 創建一個新角色
- 刪除角色
- 更新角色
- 獲得角色列表
- 獲得角色
- 獲得一個角色對象
- 通過分類名獲得角色列表
- 通過賬戶名獲得一個角色對象
- 團隊
- 新建團隊
- 更新團隊名稱
- 移除團隊小組
- 獲得團隊列表
- 獲得團隊成員
- 添加團隊小組成員
- 刪除團隊成員