# 用户服务测试指南 > **创建时间**:2025-01-18 > **适用版本**:v1.0 --- ## 一、环境准备 ### 1.1 启动数据库 确保 PostgreSQL 数据库已启动并可访问: ```bash # 检查数据库连接 psql -h 127.0.0.1 -p 5432 -U postgres -d jointo ``` ### 1.2 启动服务 ```bash cd server python -m app.main ``` 服务启动后访问: - API 文档:http://localhost:8000/api/docs - 健康检查:http://localhost:8000/health --- ## 二、API 测试 ### 2.1 手机号登录(首次 - 自动注册) ```bash curl -X POST http://localhost:8000/api/v1/auth/login/phone \ -H "Content-Type: application/json" \ -d '{ "phone": "13800138000", "country_code": "+86", "code": "6666" }' ``` **预期响应**: ```json { "user": { "user_id": 1, "phone": "13800138000", "country_code": "+86", "phone_verified": true, "username": "user_1705564800_a3f9", "nickname": null, "avatar_url": null, "ai_credits_balance": 100, "created_at": "2025-01-18T10:00:00Z" }, "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "bearer" } ``` **保存 token**: ```bash export TOKEN="" ``` --- ### 2.2 获取当前用户信息 ```bash curl -X GET http://localhost:8000/api/v1/users/me \ -H "Authorization: Bearer $TOKEN" ``` **预期响应**: ```json { "user_id": 1, "phone": "13800138000", "country_code": "+86", "phone_verified": true, "username": "user_1705564800_a3f9", "nickname": null, "avatar_url": null, "ai_credits_balance": 100, "created_at": "2025-01-18T10:00:00Z" } ``` --- ### 2.3 登出 ```bash curl -X POST http://localhost:8000/api/v1/auth/logout \ -H "Authorization: Bearer $TOKEN" ``` **预期响应**: ```json { "message": "登出成功" } ``` --- ### 2.4 验证登出后 token 失效 ```bash curl -X GET http://localhost:8000/api/v1/users/me \ -H "Authorization: Bearer $TOKEN" ``` **预期响应(401)**: ```json { "detail": "访问令牌已过期或无效" } ``` --- ### 2.5 再次登录(已存在用户) ```bash curl -X POST http://localhost:8000/api/v1/auth/login/phone \ -H "Content-Type: application/json" \ -d '{ "phone": "13800138000", "country_code": "+86", "code": "6666" }' ``` **预期行为**: - 不会创建新用户 - 返回已存在用户的信息 - 生成新的 token --- ### 2.6 错误验证码测试 ```bash curl -X POST http://localhost:8000/api/v1/auth/login/phone \ -H "Content-Type: application/json" \ -d '{ "phone": "13800138000", "country_code": "+86", "code": "1234" }' ``` **预期响应(400)**: ```json { "detail": "验证码错误" } ``` --- ## 三、数据库验证 ### 3.1 查看用户表 ```sql SELECT user_id, phone, country_code, username, ai_credits_balance, created_at FROM users WHERE deleted_at IS NULL; ``` ### 3.2 查看会话表 ```sql SELECT session_id, user_id, LEFT(token, 20) || '...' as token_preview, expires_at, ip_address, created_at, last_used_at FROM user_sessions ORDER BY created_at DESC; ``` ### 3.3 验证登出后会话被删除 ```sql -- 登出前应该有记录 SELECT COUNT(*) FROM user_sessions WHERE user_id = 1; -- 登出后应该为 0 SELECT COUNT(*) FROM user_sessions WHERE user_id = 1; ``` --- ## 四、使用 Swagger UI 测试 访问 http://localhost:8000/api/docs ### 4.1 测试登录 1. 展开 `POST /api/v1/auth/login/phone` 2. 点击 "Try it out" 3. 输入请求体: ```json { "phone": "13900139000", "country_code": "+86", "code": "6666" } ``` 4. 点击 "Execute" 5. 复制返回的 `access_token` ### 4.2 测试认证接口 1. 点击页面右上角 "Authorize" 按钮 2. 输入:`Bearer ` 3. 点击 "Authorize" 4. 现在可以测试需要认证的接口了 ### 4.3 测试获取用户信息 1. 展开 `GET /api/v1/users/me` 2. 点击 "Try it out" 3. 点击 "Execute" 4. 查看返回的用户信息 ### 4.4 测试登出 1. 展开 `POST /api/v1/auth/logout` 2. 点击 "Try it out" 3. 点击 "Execute" 4. 再次测试 `/users/me` 应该返回 401 --- ## 五、常见问题 ### 5.1 数据库连接失败 **错误信息**: ``` Failed to initialize database: could not connect to server ``` **解决方案**: 1. 检查 PostgreSQL 是否启动 2. 检查 `.env` 中的 `DATABASE_URL` 配置 3. 确认端口 5432 未被占用 ### 5.2 Token 验证失败 **错误信息**: ```json { "detail": "无效的访问令牌" } ``` **可能原因**: 1. Token 格式错误(缺少 "Bearer " 前缀) 2. Token 已过期(7 天有效期) 3. 用户已登出(会话被删除) 4. SECRET_KEY 配置不一致 ### 5.3 验证码错误 **错误信息**: ```json { "detail": "验证码错误" } ``` **解决方案**: - 当前验证码固定为 `6666` - 确认请求体中 `code` 字段值为 `"6666"` --- ## 六、性能测试 ### 6.1 并发登录测试 使用 Apache Bench: ```bash # 100 个请求,10 个并发 ab -n 100 -c 10 -p login.json -T application/json \ http://localhost:8000/api/v1/auth/login/phone ``` `login.json` 内容: ```json { "phone": "13800138000", "country_code": "+86", "code": "6666" } ``` ### 6.2 认证接口压测 ```bash # 1000 个请求,50 个并发 ab -n 1000 -c 50 -H "Authorization: Bearer $TOKEN" \ http://localhost:8000/api/v1/users/me ``` --- ## 七、安全测试 ### 7.1 测试无效 Token ```bash curl -X GET http://localhost:8000/api/v1/users/me \ -H "Authorization: Bearer invalid_token_here" ``` **预期**:返回 401 ### 7.2 测试过期 Token 修改 `.env` 中的 `ACCESS_TOKEN_EXPIRE_MINUTES=1`,等待 1 分钟后测试。 ### 7.3 测试 SQL 注入 ```bash curl -X POST http://localhost:8000/api/v1/auth/login/phone \ -H "Content-Type: application/json" \ -d '{ "phone": "13800138000\" OR \"1\"=\"1", "country_code": "+86", "code": "6666" }' ``` **预期**:参数验证失败或正常处理(不会导致 SQL 注入) --- ## 八、清理测试数据 ```sql -- 删除所有测试用户 DELETE FROM users WHERE phone LIKE '138%' OR phone LIKE '139%'; -- 清空会话表 TRUNCATE TABLE user_sessions CASCADE; -- 重置自增 ID ALTER SEQUENCE users_user_id_seq RESTART WITH 1; ALTER SEQUENCE user_sessions_session_id_seq RESTART WITH 1; ``` --- **文档版本**:v1.0 **创建时间**:2025-01-18