## **签名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);
}
}
~~~