帮助文档  > 产品文档 > API资源 > 签名生成文档

AI 云接口签名生成方法说明

APP 基础信息

Name描述内容
API入口请求的http地址http://api.ai.sogou.com/
指令类型使用的服务类型[语音/语义/图像等]speech
引擎类型具体引擎[语音识别/语音合成]asr
引擎参数具体引擎参数通过URL透传到业务服务?p1=v1&p2=v2&from=broadlink
加密前缀{Prefix}用于校验加密的参数sac-auth-v1/{appkey}/{timestamp}/{expirationPeriodInSeconds}

鉴权认证

认证信息生成方式

  1. 应用相关前缀 {AuthPrefix}

     {AuthPrefix}=sac-auth-v1/{accessKey}/{secondsSinceEpoch}/{expirationPeriodInSeconds}
    
  2. 请求相关数据 {Data}

     {Data}={REQUEST_METHOD} + "\n" + {HOST} + "\n" + {URI} + "\n" + {SORTED_QUERY_STRING}
    

    其中

    • REQUEST_METHOD 为请求使用的 HTTP 方法, 如: GET|POST|PUT|DELETE
    • HOST 为服务使用的域名, 如: api.ai.sogou.com
    • URI 为请求的服务路径, 如: /speech/asr
    • SORTED_QUERY_STRING 把 URL 中的 Query String(即 URL 中 “?” 后面的 “k1=v1&k2=v2” 字符串)进行编码后的结果。

    编码方法为:

    1. 将 Query String 根据 & 拆开成若干项,对每一项转换为 UriEncode(key) + "=" + UriEncode(value) 的形式, 其中 value 可以是空字符串
    2. 将上面转换后的所有字符串按照字典顺序排序。
    3. 将排序后的字符串按顺序用 & 符号链接起来。
  3. 生成签名 {Signature}

     {Signature}=HMAC-SHA256-BASE64({secretKey}, {AuthPrefix} + "\n" + {Data})
    
  4. 生成认证信息, 通过 Authorization header 传递

     Authorization: {AuthPrefix}/{Signature}
    

鉴权举例

  • 应用 accessKey/secretKey 分别为 bTkALtTB9x6GAxmFi9wetAGH / PMROwlieALT36qfdGClVz2iH4Sv8xZxe
  • POST 方式访问 http://api.ai.sogou.com/speech/asr 接口
  • GET 参数为 type=gbk&idx=1&starttime=1491810516
  • 当前系统时间为 1491810516
  • 计算过程

      {AuthPrefix}="sac-auth-v1/bTkALtTB9x6GAxmFi9wetAGH/1491810516/3600"
      {Data}="POST\napi.ai.sogou.com\n/speech/asr\nidx=1&starttime=1491810516&type=gbk"
      {Signature}=HMAC-SHA256-BASE64("PMROwlieALT36qfdGClVz2iH4Sv8xZxe", {AuthPrefix} + "\n" + {Data})="vuVEkzcnUeFv8FxeWS50c7S0HaYH1QKgtIV5xrxDY/s="
    
  • 最终生成的 header 为

      Authorization: sac-auth-v1/bTkALtTB9x6GAxmFi9wetAGH/1491810516/3600/vuVEkzcnUeFv8FxeWS50c7S0HaYH1QKgtIV5xrxDY/s=
    

代码示例

PHP 版

function sign($ak, $sk, $url, $method, $ttl) {
  $res = parse_url($url);
  $hst = $res["host"];
  $uri = $res["path"];

  if ($res["query"]) {
    parse_str($res["query"], $arg);
    ksort($arg);
  } else {
    $arg = array();
  }

  $arg = http_build_query($arg);
  $pre = "sac-auth-v1/$ak/".time()."/$ttl";
  $calc = "$pre\n$method\n$hst\n$uri\n$arg";

  return "$pre/".base64_encode(hash_hmac('sha256', $calc, $sk, true));
}