验证来源

接口提供方通过约定的算法来判断来源是否是开放平台。

验证算法:

{stringToSign} = {key} + ';' + base64_encode(md5({rawBody}) + ';' + {params}
{signStr} = base64_encode(hash_hmac('sha256', {stringToSign}, {secret}, true))

验证参数说明:

  • key:分组对应的后端签名key
  • secret:分组对应的后端签名secret
  • rawBody:请求原生 body 体,content-type 为 application/json
  • params:query参数 + form表单参数,参数合并后进行字典排序,拼接成参数字符串:a=a1&b=b1&c=c1,如果 post 和 query 有相同名称的参数, body 中的参数会覆盖掉 query 的参数。 php 示例代码如下: ``` $key = 'key'; $secret = 'secret'; $rawBody = 'rawBody';
if (!empty($rawBody)) {
    $signStr .= ';' . base64_encode(md5($rawBody, true));
}

$sortParams = ['query1' => 'query1', 'query2' => 'query2', 'form1' => 'form1', 'form2' => 'form2'];
$paramStr = '';
ksort($sortParams);
foreach ($sortParams as $key => $value) {
    if (!empty($paramStr)) {
        $paramStr .= '&';
    }
    if (!empty($key)) {
        $paramStr .= $key . '=';
    }

    if (!empty($value)) {
        $paramStr .= $value;
    }
}

$signStr = $key;
if (!empty($rawBody)) {
    $signStr .= ';' .  base64_encode(md5($rawBody));
}

if (!empty($paramStr)) {
    $signStr .= ';' . $paramStr;
}

return base64_encode(hash_hmac('sha256', $signStr, $this->secret, true));

```
  • 接口提供方需要按照上面的算法生成的签名和请求header中的X-Signature进行比对,如果两者相等则认为来源可信,否则认为来源不可信。

results matching ""

    No results matching ""