# 接口授权

## API Key 和 Secret的获取

### 创建新的密钥

系统管理员登录到 Elven 系统，在「项目设置-开放 API」列表，创建新的密钥

<figure><img src="https://3644585726-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fgq0d5M2WNXGfXUM1gfsx%2Fuploads%2Fj2J1Ducg4AUeivLOK4jo%2Fimage.png?alt=media&#x26;token=48223b5e-b1c5-458b-a6b8-6fba9396181c" alt=""><figcaption></figcaption></figure>

在弹出的窗口中，给密钥进行命名，选择当前密钥在哪个主体下生效，并配置具体接口的权限。

<figure><img src="https://3644585726-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fgq0d5M2WNXGfXUM1gfsx%2Fuploads%2FMdEX1jhJlkxrd3EDtVL1%2Fimage.png?alt=media&#x26;token=c7cce858-c4a4-4350-b617-fdb1521076b3" alt=""><figcaption></figcaption></figure>

点击创建按钮，新创建的密钥信息会显示在密钥列表中。

### 将API Key 和 Secret的发送给研发人员

点击密钥列表中 Key 和 Secret 后面的复制按钮，即可复制对应信息。分别发送给研发人员即可。

<figure><img src="https://3644585726-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fgq0d5M2WNXGfXUM1gfsx%2Fuploads%2FOSgGnAAvpxLqCsgz528L%2Fimage.png?alt=media&#x26;token=ae8db73c-ed36-4d65-8718-ff7daead42a2" alt=""><figcaption></figcaption></figure>

## 接口授权的使用 <a href="#elven-api-sign" id="elven-api-sign"></a>

在请求头中提供以下参数

```
elven-api-key  获取到的授权 apiKey
elven-api-sign  base64格式的签名, 例如 LVT5aXA9064gpgZrPXPLJB/Aq9r45yMF10sTZQTteyE=
elven-api-timestamp 以毫秒格式的时间戳, 例如 1721209655047，过期时间是30秒
```

其他sign的算法如下, 把 时间戳, 请求方式, 请求路由拼在一起, 使用secret进行 HMAC SHA256的加密

```javascript
// crypto 采用了 https://github.com/nodejs/node/blob/v16.9.0/lib/crypto.js 库
  /**
   * 生成签名
   * apiSecret: BjGiqCWfHGCrl065dlEBWFO5vLj7Hqiexxx,
   * timestamp: 1721205912758
   * method POST
   *  path  /open/v3/businessData
   */
  buildSign(apiSecret: string, timestamp: number, method: string, path: string) {
    const str = `${timestamp}${method}${path}`
    return crypto.createHmac('sha256', apiSecret).update(str).digest('base64')
  }

```

示例 1

```javascript
[
  'D7JLJ3awwrTdNXtSrPI1GlYE', // key
  'BjGiqCWfHGCrl065dlEBWFO5vLj7Hqie', // secret
  'POST', // method 一定是大写的
  '/open/v3/businessData' // 不能带域名, 只能以 '/' 开始的的path部分
]
{
  'elven-api-key': 'D7JLJ3awwrTdNXtSrPI1GlYE',
  'elven-api-sign': 'LVT5aXA9064gpgZrPXPLJB/Aq9r45yMF10sTZQTteyE=',
  'elven-api-timestamp': 1721209655047
}
```

示例 2

```javascript
[
  'D7JLJ3awwrTdNXtSrPI1GlYE', // key
  'BjGiqCWfHGCrl065dlEBWFO5vLj7Hqie', // secret
  'POST', // method, must be uppercase
  '/open/v3/transaction/source?page=1&limit=10' // path, must start with '/' and with query
]
// headers
{
  'elven-api-key': 'D7JLJ3awwrTdNXtSrPI1GlYE',
  'elven-api-sign': '/AHTH8m1/ZAuPqRNXCzY+iTvmCzjV+IiX0+T/WEsYrg=',
  'elven-api-timestamp': 1721209655047
}
```

示例 python 脚本

{% file src="<https://3644585726-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fgq0d5M2WNXGfXUM1gfsx%2Fuploads%2FsRg1whFNRoMeNn9o8Vga%2Fopenapi_python_sdk.py?alt=media&token=0a5882f4-3ad9-447b-943e-266c23037b79>" %}
