API请求鉴权

API请求鉴权主要是认证调用方应用权限,不针对用户权限。主要通过应用的API_KEY和API_SECRET进行一定的算法签名来校验。

1. 接口调用权限开通

向平台申请开通接口调用权限,获取 API_KEY 和 API_SECRET。API_KEY 和 API_SECRET是应用唯一标识,请妥善保存,请勿泄露。

2. 接口校验方式

在HTTP请求Header中添加下面三个属性:

属性 说明
X-AK-KEY API_KEY的值。
X-AK-TS 客户端中生成 unix-timestamp 的时间戳精确到毫秒例如:1494486506213
X-AK-PIN 签名,参照签名算法

3. 签名算法:

X-AK-PIN算法为:

以 API_SECRET 为密钥,用 hmac_sha1 对X-AK-TS进行第一次加密,记作 hmac_sha1(X-AK-TS, API_SECRET)

将第一次加密得到的结果用 BASE64 编码:,
X-AK-PIN = BASE64(hmac_sha1(X-AK-TS, API_SECRET))

例:

API_KEY: abcdefg, API_SECRECT: hijklmn, A: 1494486506213 为例, 最终添加的 HEADER 为
X-AK-KEY: abcdefg
X-AK-TS: 1494486506213
X-AK-PIN: 7EvBeyniGUlvJneFbxEgAb6H3co=

4. 调用频次

用来生成 X-AK-PIN 的同一个时间戳最多使用 当前账户限制最大并发数 次,否则会返回 PIN已被使用 错误。

若当前账户限制每秒并发数为5,则同一个时间戳可以使用5次,客户端可以多台机器并发调用

5. 错误代码对照表

code 说明
406 PIN已被使用
407 PIN时间戳和服务器时间误差超过10分钟
408 Access Secrect 验证失败
409 缺少 X-AK-KEY 或者 X-AK-PIN 或 X-AK-TS 请求头
410 Access Key 不存在
411 访问 IP 不在白名单之列
412 Access Key 已被禁用
500 服务器错误
1000 账户已过期
1001 请求额度不足
1002 账户无调用权限
1003 请求并发超限

返回数据格式

HTTP HEADER

如果发生错误,则会返回以下两个 HTTP HEADER 字段

X-AK-ERROR-CODE: ERROR CODE
X-AK-ERROR-MSG: ERROR MESSAGE
Response Body
{
    "error_code": 0,
    "success":true
    "message": "",
    "data": {

    }
 }

data 字段会根据具体的API返回 Map 或者 Array 格式

附1, 代码示例:

Python

#!/usr/bin/env python3
import http.client
import time,datetime
import hmac
import hashlib
import base64
from urllib.parse import quote

api_key="YOU API_KEY"
api_secret="YOU API_SECRET"

times = time.mktime(datetime.datetime.now().timetuple())
timestamp = str(int(round(times * 1000)))
sign = base64.b64encode(hmac.new(bytes(api_secret, 'UTF-8'), bytes(timestamp, 'UTF-8'), hashlib.sha1).digest())

conn = http.client.HTTPSConnection("openapi.lixiaoskb.com")

headers = {
'X-AK-KEY': api_key,
'X-AK-PIN': sign,
'X-AK-TS': timestamp,
}

conn.request("GET", "/services/v1/rest/enterprise/search?keyword="+quote("阿里巴巴"), headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))

JavaScript

var request = require("request");
var crypto = require("crypto");
var api_key='YOU API_KEY';
var api_secret='YOU API_SECRET';

var timestamp=new Date().getTime().toString();
var sign=crypto.createHmac('sha1', api_secret).update(timestamp).digest().toString('base64');

var options = { method: 'GET',
url: 'https://openapi.lixiaoskb.com/services/v1/rest/enterprise/search',
qs: { keyword: '阿里巴巴智能操作系统有限公' },
headers:
{
'X-AK-TS': timestamp,
'X-AK-PIN': sign,
'X-AK-KEY': api_key } };

request(options, function (error, response, body) {
if (error) throw new Error(error);

console.log(body);
});

Java

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.util.Base64;

class test {
private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
private static final String API_KEY = "YOU API_KEY";
private static final String API_SECRET = "YOU API_SECRET";

public static void main(String[] args) throws Exception {
String timestamp = String.valueOf(System.currentTimeMillis());

SecretKeySpec signingKey = new SecretKeySpec(API_SECRET.getBytes(), HMAC_SHA1_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);
String sign = Base64.getEncoder().encodeToString(mac.doFinal(timestamp.getBytes()));

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
.url("https://openapi.lixiaoskb.com/services/v1/rest/enterprise/search?keyword="+ URLEncoder.encode("阿里巴巴"))
.get()
.addHeader("X-AK-KEY", API_KEY)
.addHeader("X-AK-PIN", sign)
.addHeader("X-AK-TS", timestamp)
.build();

Response response = client.newCall(request).execute();

System.out.println(response.body().string());
}
}

NodeJS样例

版本:node 8.x
var request = require("request");
var crypto = require("crypto");
var api_key='YOU API_KEY';
var api_secret='YOU API_SECRET';

var timestamp=new Date().getTime().toString();
var sign=crypto.createHmac('sha1', api_secret).update(timestamp).digest().toString('base64');

var options = {
  method: 'GET',
  url: 'https://biz.lixiaoskb.com/services/v1/rest/enterprise/search',
  qs: { keyword: '阿里巴巴智能操作系统有限公' },
  headers: {
    'X-AK-TS': timestamp,
    'X-AK-PIN': sign,
    'X-AK-KEY': api_key
  }
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});

PHP样例

版本:PHP 7
<?php

$api_key="YOU API_KEY";
$api_secret="YOU API_SECRET";

$timestamp=substr(array_sum(explode(' ', microtime()))*1000,0,13);
$my_sign = base64_encode(hash_hmac("sha1",$timestamp,$api_secret,true));

$curl = curl_init();
$query =urlencode("阿里巴巴");
curl_setopt_array($curl, array(
  CURLOPT_URL => "https:///services/v1/rest/enterprise/search?keyword=="+$query,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "X-AK-KEY: $api_key",
     "X-AK-PIN: $my_sign",
     "X-AK-TS: $timestamp"
  )
));

$response = curl_exec($curl);

$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
?>

PostMan 使用配置

  1. Pre-request Script 中输入以下代码

     var API_KEY = "YOUR API_KEY";
     var API_SECRET = "YOUR API_SECRET";
     var ts = new Date().getTime() + "";
    
     postman.setGlobalVariable("API_KEY", API_KEY);
     postman.setGlobalVariable("X_AK_TS", ts);
     postman.setGlobalVariable("X_AK_PIN", CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(ts, API_SECRET)))
  2. Headers 中使用 Bulk Edit 的方式添加一下代码

    X-AK-KEY: {{API_KEY}}
    X-AK-PIN: {{X_AK_PIN}}
    X-AK-TS: {{X_AK_TS}}

c# 样例

using System;
using System.Security.Cryptography;
using System.Text;
class Program
{
    public static void Main(string[] args)
    {
        string apiSecret = "api_secret";
        string at = System.Convert.ToString( (long)( ( System.DateTime.Now.ToLocalTime() - ( new System.DateTime(1970, 1, 1).ToLocalTime() ) ).TotalSeconds ) * 1000 );
        HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes( apiSecret ));

        byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes( at ));

        string sign = System.Convert.ToBase64String(byteText);
        Console.WriteLine( sign );
    }
}

其他

文档更新时间: 2025-04-28 16:35   作者:姜河