## **签名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)
- 更新用户角色
- 取消管理者身份
- 创建一个账户兼任信息
- 查询用户兼任列表
- 删除兼任
- 根据用户姓名和手机获取用户对象
- 角色
- 按角色查询用户对象
- 按角色查询用户对象,包含兼职到参数指定的角色用户
- 创建一个新角色
- 删除角色
- 更新角色
- 获得角色列表
- 获得角色
- 获得一个角色对象
- 通过分类名获得角色列表
- 通过账户名获得一个角色对象
- 团队
- 新建团队
- 更新团队名称
- 移除团队小组
- 获得团队列表
- 获得团队成员
- 添加团队小组成员
- 删除团队成员