🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **签名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); } } ~~~