认证鉴权
目前所有翼若云系统的接口都是需要通过 appKey 和 appSecret 进行加密鉴权。
appKey 和 appSecret 获取
在系统后台通过创建应用获取相应的 appKey 和 appSecret。
注意
appSecret 是私有秘钥,不要泄露。如果泄露了,可以在系统后台重新生成。请不要在前端直接使用 appSecret,应当在后端使用。
加密使用
在正式使用 API 之前,需要对 appKey 和 appSecret 进行加密,并且把加密后数据放在请求头里。
需要参与加密的参数有:
app_key
: 接口验证序号app_secret
: 接口秘钥,私有秘钥,不要泄露timestamp
: 当前时间戳nonce_str
: 随机字符串
对以上参数按 key 进行字典排序,再以key=value
的方式拼接,再以{item}&{item}
的方式拼接,最后进行md5加密,生成 signature
,再把上面4个参数和生成 signature
,一起放在请求头里。
注意
timestamp 时间不能超前,生成后仅可以在 1 分钟内使用。
建议参考下面的加密例子:
TypeScript
import axios from 'axios';
import crypto from 'crypto';
const app_key = 'YOUR_APP_KEY'; // 请替换为应用的 appKey
const app_secret = 'YOUR_APP_SECRET'; // 请替换为应用的 appSecret
function md5(content: string) {
const md5er = crypto.createHash('md5');
md5er.update(content, 'utf-8');
return md5er.digest('hex');
}
function getSignParams() {
const timestamp = Date.now().toString(); // unix timestamp in ms
const nonce_str = Math.random().toString(36).substring(8);
const params = { app_key, app_secret, timestamp, nonce_str };
const keys = Object.keys(params).sort();
const str = keys.map(key => `${key}=${params[key]}`).join('&');
params.signature = md5(str);
return params;
}
axios({
url: 'YOUR_REQUEST_URL', // 请替换为具体的 API 接口
method: 'get',
headers: {
...getSignParams()
}
}).then(response => {
console.log(response.data);
}).catch(error => {
console.error(error);
});
import axios from 'axios';
import crypto from 'crypto';
const app_key = 'YOUR_APP_KEY'; // 请替换为应用的 appKey
const app_secret = 'YOUR_APP_SECRET'; // 请替换为应用的 appSecret
function md5(content: string) {
const md5er = crypto.createHash('md5');
md5er.update(content, 'utf-8');
return md5er.digest('hex');
}
function getSignParams() {
const timestamp = Date.now().toString(); // unix timestamp in ms
const nonce_str = Math.random().toString(36).substring(8);
const params = { app_key, app_secret, timestamp, nonce_str };
const keys = Object.keys(params).sort();
const str = keys.map(key => `${key}=${params[key]}`).join('&');
params.signature = md5(str);
return params;
}
axios({
url: 'YOUR_REQUEST_URL', // 请替换为具体的 API 接口
method: 'get',
headers: {
...getSignParams()
}
}).then(response => {
console.log(response.data);
}).catch(error => {
console.error(error);
});
JavaScript
import axios from 'axios';
import crypto from 'crypto';
const app_key = 'YOUR_APP_KEY'; // 请替换为应用的 appKey
const app_secret = 'YOUR_APP_SECRET'; // 请替换为应用的 appSecret
function md5(content) {
const md5er = crypto.createHash('md5');
md5er.update(content, 'utf-8');
return md5er.digest('hex');
}
function getSignParams() {
const timestamp = Date.now().toString(); // unix timestamp in ms
const nonce_str = Math.random().toString(36).substring(8);
const params = { app_key, app_secret, timestamp, nonce_str };
const keys = Object.keys(params).sort();
const str = keys.map(key => `${key}=${params[key]}`).join('&');
params.signature = md5(str);
return params;
}
axios({
url: 'YOUR_REQUEST_URL', // 请替换为具体的 API 接口
method: 'get',
headers: {
...getSignParams()
}
}).then(response => {
console.log(response.data);
}).catch(error => {
console.error(error);
});
import axios from 'axios';
import crypto from 'crypto';
const app_key = 'YOUR_APP_KEY'; // 请替换为应用的 appKey
const app_secret = 'YOUR_APP_SECRET'; // 请替换为应用的 appSecret
function md5(content) {
const md5er = crypto.createHash('md5');
md5er.update(content, 'utf-8');
return md5er.digest('hex');
}
function getSignParams() {
const timestamp = Date.now().toString(); // unix timestamp in ms
const nonce_str = Math.random().toString(36).substring(8);
const params = { app_key, app_secret, timestamp, nonce_str };
const keys = Object.keys(params).sort();
const str = keys.map(key => `${key}=${params[key]}`).join('&');
params.signature = md5(str);
return params;
}
axios({
url: 'YOUR_REQUEST_URL', // 请替换为具体的 API 接口
method: 'get',
headers: {
...getSignParams()
}
}).then(response => {
console.log(response.data);
}).catch(error => {
console.error(error);
});
Python
import hashlib
import requests
import time
import random
app_key = 'YOUR_APP_KEY' # 请替换为应用的 appKey
app_secret = 'YOUR_APP_SECRET' # 请替换为应用的 appSecret
def md5_hash(content):
return hashlib.md5(content.encode('utf-8')).hexdigest()
def get_sign_params():
timestamp = str(int(time.time() * 1000))
nonce_str = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=8))
params = {'app_key': app_key, 'app_secret': app_secret, 'timestamp': timestamp, 'nonce_str': nonce_str}
sorted_params = sorted(params.items())
str_to_sign = '&'.join([f"{k}={v}" for k, v in sorted_params])
signature = md5_hash(str_to_sign)
params['signature'] = signature
return params
request_url = 'YOUR_REQUEST_URL' # 请替换为具体的 API 接口
response = requests.get(request_url, headers=get_sign_params())
print(response.text)
import hashlib
import requests
import time
import random
app_key = 'YOUR_APP_KEY' # 请替换为应用的 appKey
app_secret = 'YOUR_APP_SECRET' # 请替换为应用的 appSecret
def md5_hash(content):
return hashlib.md5(content.encode('utf-8')).hexdigest()
def get_sign_params():
timestamp = str(int(time.time() * 1000))
nonce_str = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=8))
params = {'app_key': app_key, 'app_secret': app_secret, 'timestamp': timestamp, 'nonce_str': nonce_str}
sorted_params = sorted(params.items())
str_to_sign = '&'.join([f"{k}={v}" for k, v in sorted_params])
signature = md5_hash(str_to_sign)
params['signature'] = signature
return params
request_url = 'YOUR_REQUEST_URL' # 请替换为具体的 API 接口
response = requests.get(request_url, headers=get_sign_params())
print(response.text)