使用说明
<p>平安云提供的所有API接口支持HTTP或者HTTPS请求,允许GET和POST两种请求方法,部分接口不允许GET请求。</p>
<p>API URL请求需要使用AccessKey进行签名及URL编码。</p>
<p> </p>
<p><strong>1. 请求结构</strong></p>
<p>平安云支持基于URL发起的HTTP/HTTPS GET请求,请求参数需要包含在URL中,以下为“ListRegions”(查询地域列表接口)为例:</p>
<table border="1" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align:top">
<p>https://api.yun.pingan.com/api/v1?Action=ListRegions</p>
<p>&Id= Region-QTLzvswQFr</p>
<p>&<公共请求参数></p>
</td>
</tr>
</tbody>
</table>
<ul>
<li>https: 指定了请求通信协议。</li>
<li>api.yun.pingan.com: 接口的<span style="color:null">接入网关(</span>Endpoint)。</li>
<li>/api/v1: 代表API服务的版本为v1。</li>
<li>Action=ListRegions: 指定了要调用的具体API。</li>
<li>Id=Region-QTLzvswQFr: 是ListRegions接口的业务请求参数。</li>
<li><公共请求参数>: 是平安云约定的公共参数,与实际业务无关。</li>
</ul>
<p><strong>(1)通信协议</strong></p>
<p>支持HTTP或HTTPS协议请求通信<span style="color:null">。为了获得更高的安全性,推荐您使用HTTPS协议发送请求</span>。</p>
<p>涉及敏感数据时,如用户密码和SSH密钥对,推荐使用HTTPS协议。例如,在Login中指定Password参数时。</p>
<p><strong>(2)接入网关</strong></p>
<p>当前访问需要接入平安云中国大陆的API服务时,请使用:</p>
<table border="1" cellpadding="0" cellspacing="0" style="width:319px">
<tbody>
<tr>
<td style="vertical-align:top; width:130px">
<p style="text-align:center">地址(部署位置)</p>
</td>
<td style="vertical-align:top; width:183px">
<p style="text-align:center">接入地址</p>
</td>
</tr>
<tr>
<td style="vertical-align:top; width:130px">
<p>平安云(公有云)</p>
</td>
<td style="vertical-align:top; width:183px">
<p>https://api.yun.pingan.com</p>
</td>
</tr>
<tr>
<td style="vertical-align:top; width:130px">
<p>平安云(政务云)</p>
</td>
<td style="vertical-align:top; width:183px">
<p>https://api.city.pingan.com</p>
</td>
</tr>
</tbody>
</table>
<p><br />
<strong>(3)请求参数</strong></p>
<p>平安云提供<span style="color:null">命令模式和RESTful两种模式的API接口</span>,其中命令模式的API接口主要是IaaS类产品和部分PaaS类产品,而RESTful接口主要是SaaS类产品和部分PaaS类产品。</p>
<p>1)命令模式</p>
<p>通过Action参数指定目标操作,例如Action=RunInstance。还需要指定接口的其他参数以及公共请求参数,例如:</p>
<p>https://api.yun.pingan.com/api/v1?Action=RunInstance&<公共请求参数></p>
<p>2)RESTful模式</p>
<p>在RESTful风格的API接口中,<span style="color:null">每个URL代表一种资源(resource),所以url中不能有动词,只能有名词</span>,例如:</p>
<p>GET https://api.yun.pingan.com/rest/v1/payment/{tenantId}/balance 查询租户余额。</p>
<p>对于资源的具体操作类型,由HTTP动词表示,常用的HTTP动词有下面四个:</p>
<ul>
<li><span style="color:null"><strong>GET(SELECT)</strong>:从服务器取出资源(一项或多项)。</span></li>
<li><span style="color:null"><strong>POST(CREATE)</strong>:在服务器新建一个资源。</span></li>
<li><span style="color:null"><strong>PUT(UPDATE)</strong>:在服务器更新资源(客户端提供改变后的完整资源)。</span></li>
<li><span style="color:null"><strong>DELETE(DELETE)</strong></span>:从服务器删除资源。</li>
</ul>
<p><strong>(4)字符编码</strong></p>
<p>平安云API约定请求及返回结果都使用UTF-8字符集编码。</p>
<p> </p>
<p><strong>2. 公共参数</strong></p>
<p><strong>(1)公共请求参数</strong></p>
<table border="1" cellpadding="0" cellspacing="0" style="width:606px">
<tbody>
<tr>
<td style="width:126px">
<p style="text-align:center"><strong>参数名称</strong></p>
</td>
<td style="width:101px">
<p style="text-align:center"><strong>参数类型</strong></p>
</td>
<td style="width:79px">
<p style="text-align:center"><strong>是否必须</strong></p>
</td>
<td style="width:132px">
<p style="text-align:center"><strong>参数描述</strong></p>
</td>
<td style="width:156px">
<p style="text-align:center"><strong>格式/备注</strong></p>
</td>
</tr>
<tr>
<td style="width:126px">
<p>accessKeyId</p>
</td>
<td style="width:101px">
<p>String</p>
</td>
<td style="width:79px">
<p>true</p>
</td>
<td style="width:132px">
<p>Access Key Id</p>
</td>
<td style="width:156px">
<p> </p>
</td>
</tr>
<tr>
<td style="width:126px">
<p>signatureMethod</p>
</td>
<td style="width:101px">
<p>String</p>
</td>
<td style="width:79px">
<p>true</p>
</td>
<td style="width:132px">
<p>签名方法</p>
</td>
<td style="width:156px">
<p>HMAC-SHA1</p>
</td>
</tr>
<tr>
<td style="width:126px">
<p>signatureNonce</p>
</td>
<td style="width:101px">
<p>String</p>
</td>
<td style="width:79px">
<p>true</p>
</td>
<td style="width:132px">
<p>请求随机数</p>
</td>
<td style="width:156px">
<p> </p>
</td>
</tr>
<tr>
<td style="width:126px">
<p>signatureVersion</p>
</td>
<td style="width:101px">
<p>String</p>
</td>
<td style="width:79px">
<p>true</p>
</td>
<td style="width:132px">
<p>签名版本</p>
</td>
<td style="width:156px">
<p>1.0</p>
</td>
</tr>
<tr>
<td style="width:126px">
<p>timestamp</p>
</td>
<td style="width:101px">
<p>String</p>
</td>
<td style="width:79px">
<p>true</p>
</td>
<td style="width:132px">
<p>请求时间戳</p>
</td>
<td style="width:156px">
<p> </p>
</td>
</tr>
<tr>
<td style="width:126px">
<p>version</p>
</td>
<td style="width:101px">
<p>String</p>
</td>
<td style="width:79px">
<p>true</p>
</td>
<td style="width:132px">
<p>Api版本</p>
</td>
<td style="width:156px">
<p>2017-01-01</p>
</td>
</tr>
<tr>
<td style="width:126px">
<p>signature</p>
</td>
<td style="width:101px">
<p>String</p>
</td>
<td style="width:79px">
<p>true</p>
</td>
<td style="width:132px">
<p>请求签名</p>
</td>
<td style="width:156px">
<p> </p>
</td>
</tr>
</tbody>
</table>
<p><strong>(2)公共返回参数</strong></p>
<table border="1" cellpadding="0" cellspacing="0" style="width:607px">
<tbody>
<tr>
<td style="width:124px">
<p><strong>参数名称</strong></p>
</td>
<td style="width:99px">
<p><strong>参数类型</strong></p>
</td>
<td style="width:139px">
<p><strong>参数描述</strong></p>
</td>
<td style="width:235px">
<p><strong>格式/备注</strong></p>
</td>
</tr>
<tr>
<td style="width:124px">
<p>requestId</p>
</td>
<td style="width:99px">
<p>String</p>
</td>
<td style="width:139px">
<p>请求Id</p>
</td>
<td style="width:235px">
<p>Trace ID, 每一次请求会产生新的ID</p>
</td>
</tr>
<tr>
<td style="width:124px">
<p>code</p>
</td>
<td style="width:99px">
<p>String</p>
</td>
<td style="width:139px">
<p>请求结果状态</p>
</td>
<td style="width:235px">
<p>HTTP状态</p>
</td>
</tr>
<tr>
<td style="width:124px">
<p>message</p>
</td>
<td style="width:99px">
<p>String</p>
</td>
<td style="width:139px">
<p>请求结果国际化描述</p>
</td>
<td style="width:235px">
<p>国际化之后的消息</p>
</td>
</tr>
<tr>
<td style="width:124px">
<p>resultCode</p>
</td>
<td style="width:99px">
<p>String</p>
</td>
<td style="width:139px">
<p>请求结果状态码</p>
</td>
<td style="width:235px">
<p>A00000~Z99999</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p><strong>3. 签名机制</strong></p>
<p><strong>(1)签名机制简介</strong></p>
<p>通过AccessKey的方式访问后台接口,主要是通过<span style="color:null">签名校验</span>的方式,鉴定用户请求的url是否在传输过程中被篡改过,若签名校验通过,则认为请求没有被篡改过,后台会将请求转发到具体的服务。若签名校验失败,则被认为由于一些原因,导致当前请求是不安全的,例如用户请求的url被篡改过,用户请求过期等,后台将拒绝提供服务。在云门户注册主用户或创建子用户后,可以为每个用户生成一对AccessKey<span style="color:null">,AccessKey由AccessKeyId与AccessKeySecret组成</span>。通过AccessKeyId,可以在后台查出唯一对应的用户的详细信息;AccessKeySecret则作为秘钥,用于对请求进行签名。AccessKeySecret需要用户严格保密,来防止被盗用后用于冒充用户进行签名。</p>
<p>目前,使用签名校验的方式访问后台接口,请求的url参数由以下几个部分组成:</p>
<table border="1" cellpadding="0" cellspacing="0" style="width:273px">
<tbody>
<tr>
<td style="vertical-align:top">
<p style="text-align:center"><strong>参数名称</strong></p>
</td>
<td style="vertical-align:top; width:159px">
<p style="text-align:center"><strong>参数是否参与计算签名</strong></p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>accessKeyId</p>
</td>
<td style="vertical-align:top; width:159px">
<p>是</p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>signature</p>
</td>
<td style="vertical-align:top; width:159px">
<p><span style="color:null"><strong>否</strong></span></p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>signatureMethod</p>
</td>
<td style="vertical-align:top; width:159px">
<p>是</p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>signatureNonce</p>
</td>
<td style="vertical-align:top; width:159px">
<p>是</p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>signatureVersion</p>
</td>
<td style="vertical-align:top; width:159px">
<p>是</p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>timestamp</p>
</td>
<td style="vertical-align:top; width:159px">
<p>是</p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>version</p>
</td>
<td style="vertical-align:top; width:159px">
<p>是</p>
</td>
</tr>
<tr>
<td style="vertical-align:top">
<p>具体业务接口参数</p>
</td>
<td style="vertical-align:top; width:159px">
<p>是</p>
</td>
</tr>
</tbody>
</table>
<p><strong>(2)</strong><strong>签名生成过程</strong></p>
<p>以查询地域ListZones接口为例,调用该接口,需要传入的<span style="color:null">业务参数为action=ListZones,regionId=Region-southChina</span>。</p>
<p>必传的其他参数如公共请求参数部分所述,包括:</p>
<p>accessKeyId=xKJSFaxRfWT_7H0vSzkXLj5gzuS5HDzOkepNGbHWPtDj3mqlg_9nXf4XR23zSm1J_VPlTcXCFMx3JV0UTUDBeA,</p>
<p>signatureMethod=HMAC-SHA1,</p>
<p>signatureNonce=3378010751426913252,</p>
<p>signatureVersion=1.0,</p>
<p>timestamp= 1534159280463,</p>
<p>version=2017-01-01</p>
<p>以上参数是需要参与计算签名的请求参数。</p>
<p>1)首先要对这些参数,根据参数名称按照字母序进行排序,得到的请求参数为:<span style="color:null">accessKeyId</span>=xKJSFaxRfWT_7H0vSzkXLj5gzuS5HDzOkepNGbHWPtDj3mqlg_9nXf4XR23zSm1J_VPlTcXCFMx3JV0UTUDBeA&action=ListZones&regionId=Region-southChina&signatureMethod=HMAC-SHA1&signatureNonce=3378010751426913252&signatureVersion=1.0&timestamp=1534159280463&version=2017-01-01。</p>
<p>2)然后对请求参数,利用HmacSHA1算法进行签名计算,<span style="color:null">计算签名需要使用AccessKeySecret</span>,用户的AccessKeySecret是存储在客户端的,因此用户可以自行设置,利用AccessKeySecret和其他签名过程中必须的参数,可以计算得到最终的签名signature的值。通常,我们会通过SDK等方式,在用户端集成或提供生成签名或生成请求url的便捷方法。</p>
<p>3)<span style="color:null">客户端利用签名和其他请求参数,生成请求url</span>,开始请求服务端。</p>
<p> </p>
<p>4. 访问验证</p>
<p>请求进入后端服务时,后台会根据请求的url,进入不同的认证逻辑。<span style="color:null">使用签名的方式访问后端服务,后端将会进入到校验签名的逻辑。</span></p>
<p>后端接到请求时,会获取到所有的请求参数,以下仅为示例,后端获取的请求参数可能是无序的:</p>
<p>accessKeyId=xKJSFaxRfWT_7H0vSzkXLj5gzuS5HDzOkepNGbHWPtDj3mqlg_9nXf4XR23zSm1J_VPlTcXCFMx3JV0UTUDBeA</p>
<p>action=ListZones</p>
<p>regionId=Region-southChina</p>
<p>signatureMethod=HMAC-SHA1</p>
<p>signatureNonce=3378010751426913252</p>
<p>signatureVersion=1.0</p>
<p>timestamp=1534159280463</p>
<p>version=2017-01-01&signature</p>
<p>(1)首先后端会取出所有请求参数和请求参数值,但<span style="color:null">会将signature参数排除</span>,然后对排除signanture参数的其他参数,按照参数名称,以字母序进行排序。</p>
<p>(2)后端会根据AccessKeyId,在数据库中查找到AccessKeySecret,然后利用AccessKeySecret,对已经进行过排序的请求参数,进行签名的计算</p>
<p>(3)后端得到签名计算结果后,与请求传入的签名结果进行比较,若签名结果一致,则认为请求合法,将请求转发到具体服务,否则拒绝服务。</p>
<p>签名校验过程中,将依次对下面几个条件进行单独校验(见下表),任何一个环节校验失败,请求都将不会被执行,只有所有校验项都校验通过后,本次请求才被认为是一次合法请求。</p>
<table border="1" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="vertical-align:top; width:130px">
<p style="text-align:center"><strong>校验项</strong></p>
</td>
<td style="vertical-align:top; width:770px">
<p style="text-align:center"><strong>解释</strong></p>
</td>
</tr>
<tr>
<td style="vertical-align:top; width:130px">
<p>重复提交</p>
</td>
<td style="vertical-align:top; width:770px">
<p>AccessKey的请求方式,每个签名只能使用一次,每次请求都会生成新的签名,因此当一个签名已经被使用过一次时,15分钟内相同签名的请求会被提示重复提交</p>
</td>
</tr>
<tr>
<td style="vertical-align:top; width:130px">
<p>API版本错误</p>
</td>
<td style="vertical-align:top; width:770px">
<p>目前固定取值2017-01-01</p>
</td>
</tr>
<tr>
<td style="vertical-align:top; width:130px">
<p>签名版本错误</p>
</td>
<td style="vertical-align:top; width:770px">
<p>目前固定取值1.0</p>
</td>
</tr>
<tr>
<td style="vertical-align:top; width:130px">
<p>签名时效性</p>
</td>
<td style="vertical-align:top; width:770px">
<p>生成的签名必须在15分钟内完成请求,15分钟后签名会失效</p>
</td>
</tr>
<tr>
<td style="vertical-align:top; width:130px">
<p>签名一致性</p>
</td>
<td style="vertical-align:top; width:770px">
<p>请求中传入的签名和后端服务计算出来的签名必须一致,否则认为请求是不安全的</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p><strong>5. 返回结果</strong></p>
<p>平安云API接口<span style="color:null">返回结果主要是JSON 格式。</span>更多详情,请参阅公共参数。为了便于查看和美观,API 文档返回示例均有换行和缩进等处理,实际返回结果无换行和缩进处理。</p>
提交成功!非常感谢您的反馈,我们会继续努力做到更好!