签名校验
<h2>请求头</h2>
<p>使用请求头传递校验信息,包括:</p>
<ul>
<li><code>MX-Ak</code>: 账号ak,具体见下文</li>
<li><code>MX-Timestamp</code>: POSIX时间戳</li>
<li><code>MX-Signature</code>: 签名结果,具体见下文</li>
<li><code>MX-Noise</code>: 由字母或数字组成的16位的随机字符串,防重放攻击(5分钟内不可重复)</li>
</ul>
<hr />
<h2>签名步骤</h2>
<ol>
<li>准备当前endpoint字符串。endpoint为请求端点,不包括域名和端口号。</li>
<li>将请求参数(包括url query和form data)按照参数名的字典序升序排列,
并将排列后的参数按照key=value的形式拼接成字符串,不同参数之间使用&分隔。
此字符串记为paramStr,可为空。</li>
<li>计算请求body的md5值(注意,form data不算作body)。将md5值使用小写16进制写成字符串,
此字符串记为bodyMd5。注意:空值也具有md5。</li>
<li>准备POSIX时间戳字符串(即1970-01-01 UTC至今的秒数),此字符串记为timestamp。</li>
<li>生成一个随机字符串,记为noise。</li>
<li>将上述五个字符串拼接为<code>$endpoint|$paramStr|$bodyMd5|$timestamp|$noise</code>,
记为signStr。</li>
<li>以账号的sk为密钥,使用HMAC-SHA256对signStr进行签名,将其转为16进制小写即为签名结果。sk具体见下文</li>
<li>将ak、时间戳、生成的随机数和签名结果放入请求头中,即完成请求签名。</li>
</ol>
<hr />
<h2>签名示例</h2>
<p>假设访问的endpoint为/bos/sd-lobby/api/dummyApi,
使用POST请求,请求参数为form-data,内容param1=10,param2=11。那么上述五个字符串为:</p>
<pre><code>endpoint: /bos/sd-lobby/api/dummyApi
paramStr: param1=10&amp;param2=11
bodyMd5: d41d8cd98f00b204e9800998ecf8427e
timestamp: 1735031155
noise: osVtXUTi7eZlBE0aouSgcLLXZaywdjPr</code></pre>
<p>拼接后的signStr为:</p>
<pre><code>/bos/sd-lobby/api/dummyApi|param1=10&amp;param2=11|d41d8cd98f00b204e9800998ecf8427e|1735031155|osVtXUTi7eZlBE0aouSgcLLXZaywdjPr</code></pre>
<p>设sk为<code>HizBfsufdIBIZxNYi35nfjSIFtPjQW27</code>,则签名为:</p>
<pre><code>da2a90815cd6248caa4b62a389c27917e4b4f15c4303ed6b6bf42a62932289a3</code></pre>
<hr />
<h2>AS-SK</h2>
<h3>测试环境</h3>
<ul>
<li>AK:kingdee</li>
<li>SK:8dea0009353b4d23b293734205d62903</li>
</ul>
<h3>正式环境</h3>
<ul>
<li>AK:kingdee</li>
<li>SK:<code>待定</code></li>
</ul>
<hr />
<h2>错误代码</h2>
<ul>
<li>1001: 无此账号</li>
<li>1002: 请求已过期或为未来时刻</li>
<li>1003: 时间戳格式错误</li>
<li>1004: 签名校验失败</li>
<li>1005: Noise为空或重复请求</li>
</ul>