# VBase API 文档

## 概述

VBase 是一个多租户身份认证与访问管理(IAM)系统，支持用户管理、组织管理、RBAC权限控制和OAuth2.0服务。

**基础信息**
- 基础URL: `https://api.example.com`
- 请求格式: `application/json`
- 响应格式: `application/json`
- 认证方式: Bearer Token (JWT)

**通用响应格式**
```json
{
  "code": 200,
  "message": "success",
  "data": {}
}
```

**错误响应**
```json
{
  "code": 400,
  "message": "error message",
  "data": null
}
```

---

## 认证相关

### 用户登录

**POST** `/auth/login`

用户登录获取访问令牌。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| username | string | 是 | 用户名/邮箱/手机号 |
| password | string | 是 | 密码 |
| remember | bool | 否 | 记住登录 |

**响应示例**
```json
{
  "code": 200,
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
    "token_type": "Bearer",
    "expires_in": 3600,
    "user": {
      "id": "user-id",
      "username": "admin",
      "nickname": "管理员",
      "email": "admin@example.com",
      "avatar": "https://..."
    }
  }
}
```

---

### 用户注册

**POST** `/auth/register`

注册新用户。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| username | string | 是 | 用户名(2-50字符) |
| password | string | 是 | 密码(至少8位) |
| email | string | 否 | 邮箱 |
| phone | string | 否 | 手机号 |
| nickname | string | 否 | 昵称 |

---

### 刷新Token

**POST** `/auth/refresh`

使用刷新令牌获取新的访问令牌。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| refresh_token | string | 是 | 刷新令牌 |

---

### 用户登出

**POST** `/auth/logout`

用户登出，使当前Token失效。

**请求头**
- Authorization: Bearer {access_token}

---

### 支持的第三方登录提供商

**GET** `/auth/providers`

获取系统支持的第三方登录提供商列表。

**响应示例**
```json
{
  "code": 200,
  "data": [
    {
      "name": "google",
      "display_name": "Google",
      "icon": "google",
      "enabled": true
    },
    {
      "name": "github",
      "display_name": "GitHub",
      "icon": "github",
      "enabled": true
    }
  ]
}
```

---

### 第三方登录授权

**GET** `/auth/authorize/thirdparty`

获取第三方登录授权URL。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| provider | string | 是 | 提供商: google/github/wechat |
| redirect | string | 否 | 登录成功后重定向地址 |
| bind_mode | bool | 否 | 是否为绑定模式 |

**响应示例**
```json
{
  "code": 200,
  "data": {
    "auth_url": "https://github.com/login/oauth/authorize?...",
    "state": "random-state-string"
  }
}
```

---

### 第三方登录回调

**GET** `/auth/callback/{provider}`

处理第三方登录回调。

**路径参数**
- provider: 提供商名称

**查询参数**
- code: 授权码
- state: 状态值

**响应示例（已绑定）**
```json
{
  "code": 200,
  "data": {
    "need_bind": false,
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
    "token_type": "Bearer",
    "expires_in": 3600,
    "user": {...}
  }
}
```

**响应示例（未绑定）**
```json
{
  "code": 200,
  "data": {
    "need_bind": true,
    "provider": "github",
    "provider_id": "12345",
    "auth_url": "/auth/bind?token=xxx"
  }
}
```

---

### 绑定第三方账号

**POST** `/auth/bind`

将第三方账号绑定到已有账号。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| temp_token | string | 是 | 临时绑定令牌 |
| username | string | 是 | 用户名/邮箱/手机号 |
| password | string | 是 | 密码 |

---

## 当前用户

### 获取当前用户信息

**GET** `/me`

获取当前登录用户的信息。

**请求头**
- Authorization: Bearer {access_token}

**响应示例**
```json
{
  "code": 200,
  "data": {
    "id": "user-id",
    "username": "admin",
    "nickname": "管理员",
    "email": "admin@example.com",
    "avatar": "https://...",
    "status": 1,
    "email_verified": true
  }
}
```

---

### 更新当前用户信息

**PATCH** `/me`

更新当前用户的基本信息。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| nickname | string | 否 | 昵称 |
| avatar | string | 否 | 头像URL |
| email | string | 否 | 邮箱 |

---

### 修改密码

**POST** `/me/change-password`

修改当前用户密码。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| old_password | string | 是 | 旧密码 |
| new_password | string | 是 | 新密码(至少8位) |

---

### 获取第三方绑定列表

**GET** `/me/bindings`

获取当前用户绑定的第三方账号列表。

**响应示例**
```json
{
  "code": 200,
  "data": [
    {
      "provider": "github",
      "provider_name": "GitHub User",
      "avatar": "https://...",
      "email": "user@example.com",
      "created_at": "2024-01-01 10:00:00"
    }
  ]
}
```

---

### 解绑第三方账号

**DELETE** `/me/bindings/{provider}`

解除指定提供商的账号绑定。

**路径参数**
- provider: 提供商名称 (google/github/wechat)

---

## 用户管理

### 用户列表

**GET** `/users`

获取用户列表（需要权限）。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| page | int | 否 | 页码，默认1 |
| page_size | int | 否 | 每页数量，默认10 |
| keyword | string | 否 | 搜索关键词 |
| status | int | 否 | 状态筛选 |

**响应示例**
```json
{
  "code": 200,
  "data": {
    "items": [...],
    "total": 100,
    "page": 1,
    "page_size": 10,
    "total_pages": 10
  }
}
```

---

### 创建用户

**POST** `/users`

创建新用户（需要权限）。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| username | string | 是 | 用户名 |
| password | string | 是 | 密码 |
| nickname | string | 否 | 昵称 |
| email | string | 否 | 邮箱 |
| phone | string | 否 | 手机号 |
| status | int | 否 | 状态 |

---

### 获取用户详情

**GET** `/users/{user_id}`

获取指定用户的详细信息。

**路径参数**
- user_id: 用户ID

---

### 更新用户

**PATCH** `/users/{user_id}`

更新指定用户的信息。

**路径参数**
- user_id: 用户ID

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| nickname | string | 否 | 昵称 |
| avatar | string | 否 | 头像 |
| email | string | 否 | 邮箱 |
| phone | string | 否 | 手机号 |
| status | int | 否 | 状态 |

---

### 删除用户

**DELETE** `/users/{user_id}`

删除指定用户（软删除）。

---

### 更新用户状态

**PATCH** `/users/{user_id}/status`

更新用户状态。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| status | int | 是 | 0:禁用 1:正常 2:未激活 |

---

## 组织管理

### 组织列表

**GET** `/orgs`

获取当前用户的组织列表。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| page | int | 否 | 页码 |
| page_size | int | 否 | 每页数量 |
| keyword | string | 否 | 搜索关键词 |

**响应示例**
```json
{
  "code": 200,
  "data": {
    "items": [
      {
        "id": "org-id",
        "name": "技术部",
        "code": "tech",
        "owner_id": "user-id",
        "path": "/tech",
        "level": 0,
        "status": 1,
        "my_roles": ["admin"],
        "my_status": 1
      }
    ],
    "total": 10
  }
}
```

---

### 创建组织

**POST** `/orgs`

创建新组织。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | 是 | 组织名称 |
| code | string | 是 | 组织编码(唯一) |
| parent_id | string | 否 | 父组织ID |
| description | string | 否 | 描述 |
| max_members | int | 否 | 最大成员数 |

---

### 获取组织详情

**GET** `/orgs/{org_id}`

获取组织详细信息。

---

### 更新组织

**PATCH** `/orgs/{org_id}`

更新组织信息（仅所有者）。

---

### 删除组织

**DELETE** `/orgs/{org_id}`

删除组织（仅所有者，需无子组织）。

---

### 组织树

**GET** `/orgs/tree`

获取当前用户的组织树结构。

**响应示例**
```json
{
  "code": 200,
  "data": [
    {
      "id": "org-id",
      "name": "总公司",
      "children": [
        {
          "id": "sub-org-id",
          "name": "技术部"
        }
      ]
    }
  ]
}
```

---

### 组织成员列表

**GET** `/orgs/{org_id}/members`

获取组织成员列表。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| page | int | 否 | 页码 |
| page_size | int | 否 | 每页数量 |
| status | int | 否 | 状态筛选 |

---

## OAuth2.0 服务端

### 授权端点

**GET** `/oauth/authorize`

OAuth2.0 授权端点，获取授权码。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| response_type | string | 是 | code/token |
| client_id | string | 是 | 客户端ID |
| redirect_uri | string | 是 | 回调地址 |
| scope | string | 否 | 权限范围 |
| state | string | 是 | CSRF防护 |
| code_challenge | string | 否 | PKCE挑战码 |
| code_challenge_method | string | 否 | S256/plain |

---

### 令牌端点

**POST** `/oauth/token`

OAuth2.0 令牌端点，交换授权码获取访问令牌。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| grant_type | string | 是 | authorization_code/refresh_token/client_credentials |
| code | string | 条件 | 授权码 |
| redirect_uri | string | 条件 | 回调地址 |
| client_id | string | 是 | 客户端ID |
| client_secret | string | 是 | 客户端密钥 |
| refresh_token | string | 条件 | 刷新令牌 |
| code_verifier | string | 条件 | PKCE验证器 |

---

### 撤销令牌

**POST** `/oauth/revoke`

撤销访问令牌或刷新令牌。

---

### 令牌内省

**POST** `/oauth/introspect`

查询令牌信息（RFC 7662）。

---

### 用户信息

**GET** `/oauth/userinfo`

OIDC 用户信息端点。

---

### OIDC 发现文档

**GET** `/.well-known/openid-configuration`

获取 OIDC 配置信息。

---

### JWKS

**GET** `/oauth/jwks`

获取 JWT 签名公钥。

---

## OAuth 客户端管理

### 客户端列表

**GET** `/oauth/clients`

获取 OAuth 客户端列表。

---

### 创建客户端

**POST** `/oauth/clients`

创建新的 OAuth 客户端。

**请求参数**

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | 是 | 应用名称 |
| description | string | 否 | 描述 |
| redirect_uris | []string | 是 | 回调地址列表 |
| grant_types | []string | 否 | 授权类型 |
| allowed_scopes | []string | 否 | 允许的范围 |

**响应示例**
```json
{
  "code": 200,
  "data": {
    "id": "client-id",
    "name": "My App",
    "client_id": "abc123...",
    "client_secret": "secret...",
    "redirect_uris": ["https://app.com/callback"],
    "grant_types": ["authorization_code", "refresh_token"]
  }
}
```

---

### 获取客户端详情

**GET** `/oauth/clients/{client_id}`

获取 OAuth 客户端详情。

---

### 更新客户端

**PATCH** `/oauth/clients/{client_id}`

更新 OAuth 客户端信息。

---

### 删除客户端

**DELETE** `/oauth/clients/{client_id}`

删除 OAuth 客户端。

---

### 重新生成密钥

**POST** `/oauth/clients/{client_id}/regenerate-secret`

重新生成客户端密钥。

---

## 请求头说明

### 认证头

```
Authorization: Bearer {access_token}
```

### 组织上下文

```
X-Org-ID: {organization_id}
```

用于指定当前操作的组织上下文。

---

## 状态码说明

| 状态码 | 说明 |
|--------|------|
| 200 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未认证 |
| 403 | 无权限 |
| 404 | 资源不存在 |
| 429 | 请求过于频繁 |
| 500 | 服务器内部错误 |
