live-photo/UPDATE.md
2025-08-01 15:41:44 +08:00

162 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 更新说明
## 问题修复
### 1. API路由404错误修复
**问题**:访问 `/api/files` 接口报404错误
**原因**API路由放在了 `src/api` 目录下但Next.js 13+的App Router要求API路由放在 `src/app/api` 目录下
**解决方案**
- 将所有API路由从 `src/api` 移动到 `src/app/api`
- 更新了文件上传、文件管理、认证相关的API路由
- 添加了 `export const dynamic = 'force-dynamic';` 确保API路由动态渲染
### 2. 权限控制系统实现
**需求**:上传和管理面板需要登录后才可访问,密码可以设置为固定密码
**实现方案**
#### 认证系统架构
- **JWT Token认证**使用jsonwebtoken库实现基于token的认证
- **HTTP-only Cookie**token存储在HTTP-only cookie中增强安全性
- **中间件保护**所有需要认证的API都进行token验证
#### 新增功能模块
##### 1. 认证API路由
- `/api/auth/login` - 用户登录
- `/api/auth/logout` - 用户登出
- `/api/auth/check` - 检查认证状态
##### 2. 认证中间件 (`src/lib/auth.ts`)
- `authenticateUser()` - 验证用户密码
- `authenticateRequest()` - 验证请求的token
- 支持环境变量配置管理员密码
##### 3. 认证Hook (`src/hooks/useAuth.ts`)
- `isAuthenticated` - 认证状态
- `loading` - 加载状态
- `login()` - 登录方法
- `logout()` - 登出方法
- `checkAuth()` - 检查认证状态
##### 4. 登录模态框 (`src/components/LoginModal.tsx`)
- 密码输入框(支持显示/隐藏)
- 登录状态反馈
- 错误提示
##### 5. 认证守卫 (`src/components/AuthGuard.tsx`)
- 保护需要认证的页面
- 自动重定向到登录页面
- 登录成功后跳转到原页面
#### 权限控制实现
##### 1. 文件上传权限
- 未登录用户显示锁定状态的上传区域
- 点击上传时弹出登录模态框
- 登录成功后才能正常上传文件
##### 2. 管理面板权限
- 整个 `/admin` 路由被AuthGuard保护
- 未登录用户自动显示登录界面
- 登录后才能访问管理功能
##### 3. API权限保护
- 文件上传API (`/api/upload`) - 需要认证
- 文件管理API (`/api/files/*`) - 需要认证
- 文件列表API (`/api/files`) - 公开访问
#### 环境变量配置
新增环境变量:
```env
# Authentication
ADMIN_PASSWORD="admin123" # 管理员密码,可自定义
```
#### 用户体验优化
##### 1. 视觉反馈
- 未登录时上传区域显示锁定图标和提示
- 登录按钮在Header中显示
- 管理员身份标识
##### 2. 交互流程
- 点击需要权限的功能时自动弹出登录框
- 登录成功后自动跳转到目标页面
- 登出后自动跳转到首页
##### 3. 安全特性
- Token有效期24小时
- HTTP-only cookie防止XSS攻击
- 密码错误时提供友好提示
## 使用说明
### 默认登录信息
- **密码**`admin123`(可在 `.env.local` 中修改)
### 登录流程
1. 点击文件上传区域或访问 `/admin`
2. 在弹出的登录框中输入密码
3. 登录成功后即可使用所有功能
### 管理员功能
- 文件上传和管理
- 文件可见性控制
- 文件删除
- 查看统计信息
### 安全建议
1. **修改默认密码**:在生产环境中修改 `ADMIN_PASSWORD`
2. **使用强密码**:设置复杂的管理员密码
3. **定期更换**:定期更换管理员密码
4. **环境保护**:确保 `.env.local` 文件不被提交到版本控制
## 技术细节
### JWT Token结构
```typescript
{
isAdmin: true,
timestamp: number,
iat: number,
exp: number
}
```
### Cookie配置
```typescript
{
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'strict',
maxAge: 60 * 60 * 24, // 24 hours
path: '/',
}
```
### 错误处理
- 密码错误返回401状态码
- Token无效自动清除cookie并要求重新登录
- 网络错误:显示友好的错误提示
## 测试验证
### 功能测试
1. ✅ 未登录用户无法上传文件
2. ✅ 未登录用户无法访问管理面板
3. ✅ 登录后可以正常上传文件
4. ✅ 登录后可以访问管理面板
5. ✅ 登出后权限被正确收回
6. ✅ API路由正确响应
### 安全测试
1. ✅ Token验证正常工作
2. ✅ Cookie安全设置正确
3. ✅ 密码错误被正确拒绝
4. ✅ Token过期后需要重新登录
系统现在具备完整的权限控制功能,确保只有授权用户才能进行文件上传和管理操作。