Skip to content

认证鉴权

目前所有翼若云系统的接口都是需要通过 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)