# 统一认证平台 - 票据交互 (Ticket Exchange)

## 1. 概述
当用户已在 **源应用 (Source App)** 登录，需要无缝跳转到 **目标应用 (Target App)** 且实现免登录时，使用此接口。

**Base URL**: `{{API_BASE_URL}}/simple` (请根据实际部署环境替换)

## 2. 交互流程
1. **源应用**后端调用 `POST /exchange` 获取跳转 URL（目标为 `SIMPLE_API` 时在 URL 上附带 Ticket；目标为协议 **`NONE`（导航）** 时 **无 Ticket**，`ticket` 字段为空字符串，`redirect_url` 为导航地址原文）。
2. **源应用**前端重定向用户浏览器到该 URL。
3. **目标应用**接收请求，提取 `ticket`。
4. **目标应用**后端调用 `POST /validate` 验证票据并登录用户。

## 3. 接口定义

### 3.1 获取跳转 URL (Exchange)
- **URL**: `POST /exchange`
- **Content-Type**: `application/json`

**Request Body**:
| Field | Type | Required | Description |
|---|---|---|---|
| `app_id` | string | Yes | **源应用** ID |
| `target_app_id` | string | Yes | **目标应用** ID |
| `user_mobile` | string | Yes | 用户手机号 (身份标识) |
| `timestamp` | int | Yes | 当前时间戳 |
| `sign` | string | Yes | 签名 (**使用源应用 Secret**) |

**Response (200)**:

- 目标应用为 **`SIMPLE_API` / `OIDC`**（可消费 Ticket）时，典型形如：

```json
{
  "ticket": "TICKET-for-target-app-...",
  "redirect_url": "http://target-app-b.com/sso/callback?ticket=TICKET-..."
}
```

- 目标应用为 **`NONE`（仅导航）** 时：`ticket` 为空字符串，`redirect_url` 为首个 `redirect_uris` 导航 URL，**不带** `ticket` 查询参数。

*注*: `redirect_url` 自动取自目标应用配置的 `redirect_uris` 的第一个地址。

### 3.2 验证票据 (Validate)
目标应用接收到 ticket 后进行验证。

- **URL**: `POST /validate`
- **注意**: 此时 `app_id` 为**目标应用** ID，签名需使用**目标应用 Secret**。

## 4. 常见错误
- `404 Not Found`: 应用 ID 错误或用户不存在。
- `400 Bad Request`: 签名验证失败。

