> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zeus.agentspro.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# OAuth 令牌交换

> 用授权码交换 OAuth 访问令牌

用 OAuth 授权码交换访问令牌。此接口**不需要 JWT 认证**，因为是在 OAuth 回调流程中使用。

### 支持的 Provider

| Provider       | 说明           | 环境变量                                        |
| -------------- | ------------ | ------------------------------------------- |
| `github`       | GitHub OAuth | `GITHUB_CLIENT_ID` / `GITHUB_CLIENT_SECRET` |
| `google_drive` | Google Drive | `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` |
| `gmail`        | Gmail        | `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` |
| `slack`        | Slack        | `SLACK_CLIENT_ID` / `SLACK_CLIENT_SECRET`   |
| `notion`       | Notion       | `NOTION_CLIENT_ID` / `NOTION_CLIENT_SECRET` |

<ParamField body="provider" type="string" required>
  OAuth 提供商：`github` | `google_drive` | `gmail` | `slack` | `notion`
</ParamField>

<ParamField body="code" type="string" required>
  OAuth 授权码
</ParamField>

<ParamField body="redirect_uri" type="string" required>
  OAuth 回调 URL（必须与授权请求时一致）
</ParamField>

<ResponseField name="access_token" type="string">
  访问令牌
</ResponseField>

<ResponseField name="refresh_token" type="string">
  刷新令牌（部分 provider 提供）
</ResponseField>

<ResponseField name="expires_at" type="number">
  过期时间戳（Unix timestamp，部分 provider 提供）
</ResponseField>

<ResponseField name="token_type" type="string">
  令牌类型，通常为 `Bearer`
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://zeus-api.agentspro.cn/api/tools/oauth/exchange \
    --header 'Content-Type: application/json' \
    --data '{
      "provider": "github",
      "code": "abc123def456",
      "redirect_uri": "https://zeus.agentspro.cn/oauth/callback"
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "access_token": "gho_xxxxxxxxxxxx",
    "refresh_token": null,
    "expires_at": null,
    "token_type": "Bearer"
  }
  ```
</ResponseExample>
