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 使用配置
在
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)))
在
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 );
}
}
其他
无