内部网关API签名规则
<p>[TOC]</p>
<h2>变更记录</h2>
<table>
<thead>
<tr>
<th>日期</th>
<th>修订版本</th>
<th>修改描述</th>
<th>修改人</th>
</tr>
</thead>
<tbody>
<tr>
<td>2019.9.16</td>
<td>V1.0</td>
<td>创建文档</td>
<td>lison.jiang</td>
</tr>
<tr>
<td>2019.10.17</td>
<td>V1.0</td>
<td>增加签名示例链接</td>
<td>mark.zhang</td>
</tr>
</tbody>
</table>
<h2>签名说明</h2>
<p>请求分为请求头和请求体两部分,请求头 AppKey、Nonce、Signature、Timestamp 都必须填入,其中AppKey、Nonce、Timestamp 参与签名,Signature 是计算出来的签名值。</p>
<p><strong>请求头签名参数(严格按大小写):</strong></p>
<ul>
<li>请求参数</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">字段</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">空</th>
<th>默认</th>
<th>注释</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">AppKey</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">否</td>
<td></td>
<td>给应用分配的 appKey</td>
</tr>
<tr>
<td style="text-align: left;">Nonce</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">否</td>
<td>随机字符串UUID,与 Timestamp 联合起来,用于防止重放攻击。10分钟内的请求Nonce不能有重复。</td>
</tr>
<tr>
<td style="text-align: left;">Signature</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">否</td>
<td>请求签名,用来验证此次请求的合法性,需要用户根据实际的输入参数计算得出。计算方法可参考签名说明章节。</td>
</tr>
<tr>
<td style="text-align: left;">Timestamp</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">否</td>
<td>当前 UNIX 时间戳,可记录发起 API 请求的时间。精确到毫秒</td>
</tr>
</tbody>
</table>
<h2>签名算法</h2>
<p>1、对所有请求key(AppKey, Nonce, Timestamp必有)按参数名做字典序升序排列。(所谓字典序升序排列,直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二个“字母”,依此类推。)</p>
<p>参数排序后拼接字符串,将把上一步排序好的请求参数格式化成“参数名称”=“参数值”的形式如:</p>
<pre><code>Key1=value1& Key2=value2& Key3=value3&…………</code></pre>
<p>2、拼接最终签名字符串,将秘钥 appSecrect 拼接在字符串前后</p>
<pre><code>appSecrect& Key1=value1& Key2=value2& Key3=value3&………& appSecrect</code></pre>
<p>注意:对于 post 请求,key 固定为 “requestBody”,value 为请求的整个 body。
例如:post的body:</p>
<pre><code class="language-json">{
"openId":"8ba49d502895d521e7c29885597218d7",
"sessionId":"2fe410d9fc9f708f77000eab113aaa0a",
"appkey":"LsP2XAYmBF6jHXTPOMZO"
}</code></pre>
<p>参数字典升排序字符串前后加上 <strong>appSecrect</strong>(JSxPpoOzc9de9gC2wiSt)</p>
<p>3、md5生成签名串(32位小写),并进行 UrlEncode</p>
<pre><code>UrlEncode(md5(appSecrect& Key1=value1& Key2=value2& Key3=value3&………& appSecrect))</code></pre>
<p>结果为:</p>
<pre><code>ee427fc6c0afad74c6116aad13be0b68</code></pre>
<p><strong>注意事项:</strong></p>
<ul>
<li>appkey,appSecrect 是给乐逗给游戏分配的秘钥对。</li>
<li>微服务业务控制台地址:<a href="http://biz.cloud.idreamsky.com">http://biz.cloud.idreamsky.com</a> 创建应用就能得到相应的 <strong>appkey</strong>,<strong>Appsecrect</strong>.</li>
</ul>
<h2>签名代码示例</h2>
<p>请参考 <a href="https://www.showdoc.cc/mssdk?page_id=2992099572666798">签名示例</a> 文档。</p>