# AIOJ 认证服务 API 文档

## 概述

AIOJ认证服务提供JWT（JSON Web Token）为基础的用户认证和授权功能。该服务负责用户登录、令牌生成、令牌刷新和令牌验证。

**基础信息:**
- 服务名称: auth-service
- 基础路径: `/api`
- API版本: v1
- 认证方式: JWT Bearer Token
- 数据格式: JSON

## JWT认证机制

### 访问令牌 (Access Token)
- 有效期: 15分钟
- 用途: 访问受保护的API接口
- 格式: Bearer Token

### 刷新令牌 (Refresh Token)
- 有效期: 7天
- 用途: 获取新的Access Token
- 存储位置: Redis

### 请求头格式
```
Authorization: Bearer {access_token}
```

## API接口

### 1. 用户登录
用户通过用户名和密码进行登录认证。

**接口信息:**
- URL: `POST /api/v1/auth/login`
- 描述: 用户登录获取访问令牌
- 认证要求: 无需认证

**请求参数:**
```json
{
  "userAccount": "string",  // 用户账号
  "userPassword": "string"  // 用户密码
}
```

**请求示例:**
```bash
curl -X POST http://localhost:10011/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "userAccount": "admin",
    "userPassword": "password123"
  }'
```

**响应示例:**
```json
{
  "success": true,
  "message": "操作成功",
  "data": {
    "id": 1,
    "userAccount": "admin",
    "unionId": null,
    "accessToken": "eyJhbGciOiJIUzI1NiJ9...",
    "refreshToken": "eyJhbGciOiJIUzI1NiJ9...",
    "expire": null
  }
}
```

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

**接口信息:**
- URL: `POST /api/v1/auth/refresh`
- 描述: 刷新访问令牌
- 认证要求: 无需认证

**请求参数:**
```
refreshToken=string  // 刷新令牌
```

**请求示例:**
```bash
curl -X POST "http://localhost:10011/api/v1/auth/refresh?refreshToken=eyJhbGciOiJIUzI1NiJ9..."
```

**响应示例:**
```json
{
  "success": true,
  "message": "操作成功",
  "data": {
    "id": null,
    "userAccount": null,
    "unionId": null,
    "accessToken": "eyJhbGciOiJIUzI1NiJ9...",
    "refreshToken": "eyJhbGciOiJIUzI1NiJ9...",
    "expire": null
  }
}
```

### 3. 获取访问令牌
简化版的登录接口，仅返回访问令牌。

**接口信息:**
- URL: `POST /api/v1/auth/auth`
- 描述: 获取访问令牌（简化版登录）
- 认证要求: 无需认证

**请求参数:**
```json
{
  "userAccount": "string",  // 用户账号
  "userPassword": "string"  // 用户密码
}
```

**请求示例:**
```bash
curl -X POST http://localhost:10011/api/v1/auth/auth \
  -H "Content-Type: application/json" \
  -d '{
    "userAccount": "admin",
    "userPassword": "password123"
  }'
```

**响应示例:**
```json
{
  "success": true,
  "message": "操作成功",
  "data": "eyJhbGciOiJIUzI1NiJ9..."
}
```

### 4. 令牌验证
验证访问令牌的有效性。

**接口信息:**
- URL: `POST /api/v1/auth/validate`
- 描述: 验证访问令牌
- 认证要求: 可选的Authorization头

**请求头:**
```
Authorization: Bearer {access_token}  // 可选
```

**请求示例:**
```bash
curl -X POST http://localhost:10011/api/v1/auth/validate \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."
```

**响应示例:**
```json
{
  "success": true,
  "message": "操作成功",
  "data": true
}
```

## 状态码说明

| 状态码 | 说明 | 描述 |
|--------|------|------|
| 200 | OK | 请求成功 |
| 400 | Bad Request | 请求参数错误 |
| 401 | Unauthorized | 未授权访问或令牌无效 |
| 403 | Forbidden | 禁止访问 |
| 500 | Internal Server Error | 服务器内部错误 |

## 错误响应格式

```json
{
  "success": false,
  "message": "错误描述",
  "data": null
}
```

## 常见错误码

| 错误信息 | 可能原因 | 解决方案 |
|----------|----------|----------|
| "用户不存在或密码错误" | 用户账号或密码不正确 | 检查用户名和密码 |
| "Refresh Token 已过期" | 刷新令牌已过期 | 重新登录获取新令牌 |
| "Refresh Token 已失效" | 刷新令牌在Redis中不存在或已失效 | 重新登录获取新令牌 |
| "系统错误" | 服务间调用失败或系统异常 | 检查服务状态和网络连接 |

## 配置信息

### JWT配置
```yaml
jwt:
  secret: "12345678901234567890123456789012"  # 32字节密钥
  access-expire: 900000        # 15分钟（毫秒）
  refresh-expire: 604800000    # 7天（毫秒）
```

### 服务配置
```yaml
spring:
  application:
    name: auth-service
server:
  port: 10011
  servlet:
    context-path: /api
```

## 安全注意事项

1. **令牌存储**: Access Token应存储在内存或HttpOnly Cookie中
2. **HTTPS传输**: 生产环境必须使用HTTPS协议
3. **密钥管理**: JWT密钥应定期轮换，使用强密钥
4. **令牌过期**: 合理设置令牌过期时间，平衡安全性和用户体验
5. **错误处理**: 不要在错误信息中泄露敏感信息

## 使用流程

1. **用户登录**: 调用`/login`接口获取Access Token和Refresh Token
2. **API访问**: 在请求头中携带Access Token访问受保护接口
3. **令牌刷新**: Access Token过期时使用Refresh Token获取新的Access Token
4. **令牌验证**: 可使用`/validate`接口验证Token有效性

## 联系信息

如有问题或建议，请联系开发团队。

---
*文档版本: v1.0*
*更新时间: 2025-12-14*