自然语言处理:安全验证:签名字符串

认证字符串

谛听开放平台API使用基于认证字符串的HTTP请求签名机制来验证用户身份,对于HTTP请求,都应携带一个认证字符串和应用token。当谛听服务器收到用户的HTTP请求后,系统将按以下流程进行处理。

  1. 判断用户的请求token是否可用,若不可用则拒绝该请求;否则执行下一步操作。
  2. 判断用户的请求是否超时,即服务器收到请求的时间需要符合以下要求:{timestamp} - 10分钟 < 服务器接收到请求时间 < {timestamp} + 10分钟 timestamp代表签名生效UTC时间(格式:yyyyMMddHHmmss)。为了防止用户时钟与服务器时钟不同步而导致的认证失败,此处引入10分钟的宽松系数。如果服务器收到请求的时间不符合以上时间要求,则认为请求超时,拒绝该请求;如果符合上述要求,则执行下一步操作。
  3. 判断用户的nonce随机字符串(格式不限制,不可为空)是否重复,同一nonce随机字符串10分钟内只允许使用一次,如果nonce随机字符串10分钟内重复则,则认为重复请求,拒绝该请求;否则执行下一步操作。
  4. 基于HTTP请求信息,使用相同的算法,生成sign字符串。
  5. 使用服务器生成的sign字符串与用户提供的字符串进行比对,如果内容不一致,则认为认证失败,拒绝该请求;如果内容一致,则表示认证成功,系统将按照用户的请求内容进行操作。
  1. 按照请求参数名的字母升序排列非空请求参数,使用URL键值对的格式(即key1 = value1 & key2 = value2…)拼接成字符串stringA,这其中包含timestamp和nonce
  2. 在stringA最后拼接上appkey得到字符串stringSignTemp
  3. 对stringSignTemp进行md5Base64运算,并将得到的字符串所有字符转换为大写,得到sign值。

代码举例

      Map<String, Object> paramMap = "请求参数键值对(包含接口必要非空参数、timestamp和nonce)", 
      String appKey = "平台对应的app key";
      //按参数名排序
      Set<String> keySet = paramMap.keySet();
      String[] keyArray = keySet.toArray(new String[keySet.size()]);
      Arrays.sort(keyArray);
      StringBuilder params = new StringBuilder();
      for (String k : keyArray) {
          if (k.equals("sign")) {
              continue;
          }
          if (StringUtils.isNotEmpty(paramMap.get(k).toString().trim())) {
              params.append(k).append("=").append(paramMap.get(k).toString().trim()).append("&");
          }
      }
      //排序后拼接 "&appsecret=" + appKey
      params.append("&appsecret=" + appKey);
      //加密后转为大写
      String sign = EncryptUtils.md5Base64(params.toString()).toUpperCase();
      

相关举例: 为了便于用户理解认证字符串的生成过程,我们将使用一个例子来详细介绍算法的生成步骤。 用户请求转换拼音接口 HTTP请求如下:

 POST 
 header 'Content-Type: application/json' 
 header 'Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiMSIsImFwcF9rZXkiOiJ0ZjQ3cjJrb3kzNSIsInNjb3BlIjpbImFsbCJdLCJleHRfbmFtZSI6ImxpdWZlaSIsImRpdGluZ191c2VybmFt'
 '{ 
 "remainNone": false, 
 "separator": ",", 
 "text": "我在马路边" 
 }'
'https://console.ditingai.com/nlp/tokenizer/convert_to_pinyin? 
 timestamp=20190719161000&nonce=110qwe&sign=1OFXO7SSFLLZNPOC45MC3A=='

参数介绍

  • 请求头信息 header:
  1. Authorization:“bearer ”(固定字符'bearer'和一个英文空格)+用户请求的token
  2. Content-Type: application/json (json格式)
  • 请求参数 body:
  1. remainNone: false 是否去除标点
  2. separator: “,” 分隔符
  3. text:“我在马路边” 需要转换的字符串
  • 请求参数 url:
  1. timestamp:20190719161000 请求时间戳(北京时间)
  2. nonce:110qwe 随机字符串
  3. sign:1OFXO7SSFLLZNPOC45MC3A== 参数签名

签名流程

  1. 按照请求参数名的字母升序排列非空请求参数,使用URL键值对的格式拼接字符串stringA(即nonce=110qwe&remainNone=false&separator=,&text=我在马路边&timestamp=20190719161000
  2. 在stringA最后拼接上appkey得到字符串stringSignTemp(即nonce=110qwe&remainNone=false&separator=,&text=我在马路边&timestamp=20190719161000&appsecret=1111 #1111为应用的appkey#)
  3. 对stringSignTemp进行md5Base64运算,并将得到的字符串所有字符转换为大写,得到sign值。
  4. 将sign拼接到请求url中请求api访问服务器。
  • 自然语言处理/安全验证/签名字符串.txt
  • 最后更改: 2019/08/13 16:59
  • 由 diting01