file-system/docs/LOGIN_GUIDE.md
root 54f66c56ed feat: 添加 Web UI 登录功能
为 Web UI 添加完整的登录验证系统,遵循 CQRS 架构模式。

主要功能:
- 创建登录页面 UI (web/login.html)
  - 美观的渐变背景设计
  - 密钥输入和验证
  - 错误提示和加载状态

- 实现登录验证 (遵循 CQRS)
  - 新增 LoginQuery 和 LoginHandler (internal/api/handlers/auth_handlers.go)
  - 新增 AuthEndpoint (internal/api/endpoints/auth_endpoints.go)
  - 注册登录接口 /auth/login (无需授权)

- 更新主页面 (web/index.html)
  - 添加登录状态检查
  - 未登录显示提示信息
  - 所有 API 请求自动携带 X-API-Key 头
  - 添加退出登录功能
  - 401 错误自动跳转登录页

- 更新路由配置 (cmd/server/main.go)
  - 添加 /auth/login 公开路由
  - 注册登录处理器和端点

- 新增登录文档 (docs/LOGIN_GUIDE.md)
  - 完整的使用说明
  - 技术实现细节
  - API 接口说明

安全特性:
- 密钥存储在 localStorage
- 自动处理登录过期
- 支持主动退出登录

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-05 20:27:45 +08:00

175 lines
3.6 KiB
Markdown

# Web 登录功能说明
## 功能概述
Web UI 现已添加密钥登录功能,用户必须先登录才能访问文件管理系统。
## 使用流程
### 1. 访问登录页面
打开浏览器访问:
```
http://localhost:8080/web/login.html
```
### 2. 输入 API 密钥
在登录页面输入 API 密钥:
```
xn001624.
```
### 3. 登录成功
登录成功后,系统会:
- 将密钥保存到浏览器的 localStorage
- 自动跳转到主页面 `/web/`
- 所有后续 API 请求都会自动携带密钥
### 4. 退出登录
点击右上角的"退出"按钮可以:
- 清除本地存储的密钥
- 跳转回登录页面
## 技术实现
### 后端 (遵循 CQRS 模式)
1. **登录查询** (`internal/api/handlers/auth_handlers.go`)
```go
type LoginQuery struct {
APIKey string `json:"api_key" binding:"required"`
}
```
2. **登录处理器**
```go
type LoginHandler struct {
apiKey string
}
func (h *LoginHandler) Handle(ctx context.Context, query LoginQuery) (LoginResult, error)
```
3. **认证端点** (`internal/api/endpoints/auth_endpoints.go`)
```go
func (e *AuthEndpoint) Login(c *gin.Context)
```
4. **路由配置** (`cmd/server/main.go`)
- `/auth/login` - 公开接口,无需授权
- 所有其他 API 接口都需要 `X-API-Key` 请求头
### 前端
1. **登录页面** (`web/login.html`)
- 美观的渐变背景登录界面
- 密钥输入框(密码类型)
- 表单验证和错误提示
- 登录后自动跳转
2. **主页面** (`web/index.html`)
- 检查 localStorage 中的 token
- 未登录显示提示信息
- 已登录正常显示文件管理界面
- 所有 API 请求自动携带 `X-API-Key` 头
- 401 错误自动跳转回登录页
## 安全特性
1. **前端存储**: 使用 localStorage 存储密钥(适合单用户场景)
2. **自动过期**: 当 API 返回 401 时自动清除密钥并跳转登录
3. **密钥保护**: 密钥输入框使用 password 类型,屏幕上不可见
4. **退出功能**: 支持主动退出登录
## 接口说明
### POST /auth/login
**请求体**:
```json
{
"api_key": "xn001624."
}
```
**成功响应** (200):
```json
{
"success": true,
"message": "登录成功",
"token": "xn001624."
}
```
**失败响应** (200):
```json
{
"success": false,
"message": "API密钥无效"
}
```
## 使用示例
### 使用 cURL 测试登录接口
```bash
curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{"api_key": "xn001624."}'
```
### 前端 API 调用示例
登录后,所有 API 请求会自动携带密钥:
```javascript
// 登录
const res = await axios.post('/auth/login', {
api_key: 'xn001624.'
});
// 保存 token
localStorage.setItem('rustfs_token', res.data.token);
// 后续请求自动携带密钥
const api = axios.create({
baseURL: window.location.origin,
headers: {
'X-API-Key': localStorage.getItem('rustfs_token')
}
});
// 调用 API
const buckets = await api.get('/buckets');
```
## 文件结构
```
internal/
├── api/
│ ├── endpoints/
│ │ └── auth_endpoints.go # 认证端点
│ └── handlers/
│ └── auth_handlers.go # 登录处理器
└── middleware/
└── auth.go # API 授权中间件
web/
├── login.html # 登录页面
└── index.html # 主页面(含登录检查)
```
## 更新日志
### v1.2
- ✨ 添加 Web 登录功能
- ✨ 创建登录页面 UI
- ✨ 实现 CQRS 模式的登录验证
- 🔒 所有 Web 操作需要先登录
- 📝 添加登录文档