# 获取访问令牌

> OpenAPI / 认证

网页：https://open.qiandao.com/docs/api/auth-token

支持两种授权模式：CLIENT_CREDENTIALS（客户端凭证）和 AUTHORIZATION_CODE（授权码，用户登录后）。

## 请求

`POST https://openapi.qiandao.com/auth/v1/token`

所有业务 API 请求需携带 access-token 请求头传入访问令牌，以及 x-echo-qdmp-version 版本标识。

### 请求头

无需访问令牌。JSON 请求体使用 `Content-Type: application/json`。

## 请求参数

| 参数 | 类型 | 必填 | 位置 | 说明 |
| --- | --- | --- | --- | --- |
| grantType | string | 是 | body | 授权类型：CLIENT_CREDENTIALS 或 AUTHORIZATION_CODE |
| appId | string | 是 | body | 应用 ID |
| appSecret | string | 是 | body | 应用密钥 |
| code | string | 授权码模式必填 | body | 授权码（授权码模式必填，来自 qd.login()） |

## 成功响应

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| data.accessToken | string | 访问令牌 |
| data.expiresAt | int64 | 过期时间（秒） |
| data.refreshToken | string | 刷新令牌 |
| data.openId | string | 用户应用下唯一标识 |

## 错误码

| 错误码 | 说明 |
| --- | --- |
| 10001 | appId 无效 |
| 10002 | 密钥不匹配 |
| 10003 | 授权码错误 |
| 10004 | 认证类型不支持 |

## 请求示例


```javascript
// 客户端凭证模式
const res = await fetch('https://openapi.qiandao.com/auth/v1/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    grantType: 'CLIENT_CREDENTIALS',
    appId: 'your_app_id',
    appSecret: 'your_app_secret',
  }),
})
const { data } = await res.json()
// data: { accessToken, expiresAt, refreshToken, openId }

// 授权码模式（用户登录后）
const res2 = await fetch('https://openapi.qiandao.com/auth/v1/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    grantType: 'AUTHORIZATION_CODE',
    appId: 'your_app_id',
    appSecret: 'your_app_secret',
    code: loginCode, // 来自 qd.login()
  }),
})
```
