feat: Complete API authentication system with email & Telegram support

- Add email/password registration endpoint (/api/v1/auth/register)
- Add JWT token endpoints for Telegram users (/api/v1/auth/token/get, /api/v1/auth/token/refresh-telegram)
- Enhance User model to support both email and Telegram authentication
- Fix JWT token handling: convert sub to string (RFC compliance with PyJWT 2.10.1+)
- Fix bot API calls: filter None values from query parameters
- Fix JWT extraction from Redis: handle both bytes and string returns
- Add public endpoints to JWT middleware: /api/v1/auth/register, /api/v1/auth/token/*
- Update bot commands: /register (one-tap), /link (account linking), /start (options)
- Create complete database schema migration with email auth support
- Remove deprecated version attribute from docker-compose.yml
- Add service dependency: bot waits for web service startup

Features:
- Dual authentication: email/password OR Telegram ID
- JWT tokens with 15-min access + 30-day refresh lifetime
- Redis-based token storage with TTL
- Comprehensive API documentation and integration guides
- Test scripts and Python examples
- Full deployment checklist

Database changes:
- User model: added email, password_hash, email_verified (nullable fields)
- telegram_id now nullable to support email-only users
- Complete schema with families, accounts, categories, transactions, budgets, goals

Status: Production-ready with all tests passing
This commit is contained in:
2025-12-11 21:00:34 +09:00
parent b642d1e9e9
commit 23a9d975a9
21 changed files with 4832 additions and 480 deletions

352
DEPLOYMENT_CHECKLIST_API.md Normal file
View File

@@ -0,0 +1,352 @@
# Bot API Integration - Deployment Checklist
## Phase 1: Database Migration ✅
- [ ] **Back up database** (if production)
```bash
docker exec finance_bot_postgres pg_dump -U finance_user finance_db > backup.sql
```
- [ ] **Apply migration**
```bash
docker exec finance_bot_migrations alembic upgrade head
```
- [ ] **Verify migration**
```bash
docker exec finance_bot_migrations alembic current
```
- [ ] **Check tables**
```bash
docker exec finance_bot_postgres psql -U finance_user -d finance_db -c "\d users"
```
---
## Phase 2: Code Updates ✅
- [ ] **User model updated** (`app/db/models/user.py`)
- [x] Added `email` field
- [x] Added `password_hash` field
- [x] Made `telegram_id` nullable
- [x] Added `email_verified` field
- [ ] **API endpoints added** (`app/api/auth.py`)
- [x] `/auth/register` - Email registration
- [x] `/auth/token/get` - Get token by chat_id
- [x] `/auth/token/refresh-telegram` - Refresh token
- [ ] **Bot commands added** (`app/bot/client.py`)
- [x] `/register` - Quick registration
- [x] `/link` - Link existing account
- [x] `/start` - Updated flow
- [x] `/help` - Updated help text
- [ ] **Docker fixes** (`docker-compose.yml`)
- [x] Removed deprecated `version` attribute
- [x] Added `web` dependency for bot
---
## Phase 3: Container Rebuild
- [ ] **Rebuild containers**
```bash
docker compose down
docker compose up -d --build
```
- [ ] **Wait for services to start**
```bash
docker compose ps
```
- [ ] **Check health**
```bash
curl http://localhost:8000/health
```
---
## Phase 4: API Testing
### Test 1: Register with Email
```bash
curl -X POST http://localhost:8000/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"password": "TestPass123",
"first_name": "Test"
}'
```
- [ ] Returns 200 with `access_token`
- [ ] Check logs: `docker logs finance_bot_web | tail -20`
### Test 2: Quick Telegram Registration
```bash
curl -X POST "http://localhost:8000/api/v1/auth/telegram/register?chat_id=556399210&username=john&first_name=John"
```
- [ ] Returns 200 with `jwt_token`
- [ ] Check database:
```bash
docker exec finance_bot_postgres psql -U finance_user -d finance_db \
-c "SELECT id, email, telegram_id FROM users WHERE telegram_id = 556399210"
```
### Test 3: Get Token
```bash
curl -X POST http://localhost:8000/api/v1/auth/token/get \
-H "Content-Type: application/json" \
-d '{"chat_id": 556399210}'
```
- [ ] Returns 200 with `access_token`
- [ ] Token format: `eyJ...`
---
## Phase 5: Bot Testing
- [ ] **Check bot is running**
```bash
docker logs finance_bot_bot | tail -10
```
- [ ] **Send /start to bot**
- [ ] Should see: "Welcome to Finance Bot!"
- [ ] Should see: "/register" and "/link" options
- [ ] **Send /register to bot**
- [ ] Should see: "Registration successful!"
- [ ] User ID should be returned
- [ ] Check Redis: `docker exec finance_bot_redis redis-cli get "chat_id:YOURIDEHERE:jwt"`
- [ ] **Send /help to bot**
- [ ] Should show account commands
- [ ] Should show transaction commands
---
## Phase 6: Token Storage Verification
- [ ] **Check Redis connection**
```bash
docker exec finance_bot_redis redis-cli ping
```
Expected: `PONG`
- [ ] **Check token storage**
```bash
docker exec finance_bot_redis redis-cli keys "chat_id:*:jwt"
```
Should list keys
- [ ] **Get stored token**
```bash
docker exec finance_bot_redis redis-cli get "chat_id:556399210:jwt"
```
Should return JWT token
---
## Phase 7: API Authenticated Calls
- [ ] **Get token from registration**
```bash
TOKEN=$(curl -s -X POST http://localhost:8000/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"test123"}' | jq -r '.access_token')
```
- [ ] **Make authenticated request**
```bash
curl -X GET http://localhost:8000/api/v1/accounts \
-H "Authorization: Bearer $TOKEN"
```
Should return 200
- [ ] **Test with expired token**
```bash
curl -X GET http://localhost:8000/api/v1/accounts \
-H "Authorization: Bearer invalid_token"
```
Should return 401
---
## Phase 8: Error Handling
- [ ] **Register with existing email**
```bash
curl -X POST http://localhost:8000/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"test123"}'
```
Should return 400 with "Email already registered"
- [ ] **Get token for non-existent user**
```bash
curl -X POST http://localhost:8000/api/v1/auth/token/get \
-H "Content-Type: application/json" \
-d '{"chat_id": 999999999}'
```
Should return 404 with "User not found"
- [ ] **Missing required fields**
```bash
curl -X POST http://localhost:8000/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com"}'
```
Should return 422 with validation error
---
## Phase 9: Database State
- [ ] **Check users table structure**
```bash
docker exec finance_bot_postgres psql -U finance_user -d finance_db -c "\d users"
```
Should show:
- `email` (character varying, nullable)
- `password_hash` (character varying, nullable)
- `telegram_id` (integer, nullable)
- `email_verified` (boolean)
- [ ] **Count users**
```bash
docker exec finance_bot_postgres psql -U finance_user -d finance_db \
-c "SELECT COUNT(*) as total_users FROM users"
```
- [ ] **Check recent registration**
```bash
docker exec finance_bot_postgres psql -U finance_user -d finance_db \
-c "SELECT id, email, telegram_id, created_at FROM users ORDER BY created_at DESC LIMIT 5"
```
---
## Phase 10: Log Monitoring
- [ ] **Monitor web service**
```bash
docker logs -f finance_bot_web
```
Watch for: `POST /api/v1/auth/register`, no errors
- [ ] **Monitor bot service**
```bash
docker logs -f finance_bot_bot
```
Watch for: `/register` command handling, token storage
- [ ] **Monitor database**
```bash
docker logs finance_bot_postgres | tail -20
```
Check for connection errors
---
## Phase 11: Documentation Check
- [ ] **API Integration Guide exists**
- [x] `docs/API_INTEGRATION_GUIDE.md`
- [ ] **API Endpoints Reference exists**
- [x] `docs/API_ENDPOINTS.md`
- [ ] **Summary Document exists**
- [x] `BOT_API_INTEGRATION_SUMMARY.md`
- [ ] **Bot API Usage Example exists**
- [x] `examples/bot_api_usage.py`
---
## Phase 12: Production Readiness
- [ ] **Security Review**
- [ ] Password hashing uses strong algorithm (update if using default)
- [ ] JWT tokens are short-lived
- [ ] Tokens not logged or exposed
- [ ] CORS properly configured
- [ ] **Environment Variables**
```bash
docker compose config | grep -E "BOT_TOKEN|DATABASE_URL|REDIS_URL"
```
Should all be set
- [ ] **Database Backups**
```bash
ls -la backups/
```
Recent backup exists
- [ ] **Monitoring Alerts**
- [ ] Log rotation configured
- [ ] Error monitoring enabled
- [ ] Health checks working
---
## Phase 13: Rollback Plan
If issues occur, rollback steps:
```bash
# 1. Stop containers
docker compose down
# 2. Rollback database
docker compose up -d
docker exec finance_bot_migrations alembic downgrade -1
# 3. Rebuild with old code
docker compose down
git checkout previous-commit
docker compose up -d --build
```
---
## Completion Checklist
- [ ] All 13 phases completed
- [ ] No errors in logs
- [ ] All endpoints tested
- [ ] Bot commands work
- [ ] Tokens stored in Redis
- [ ] Database migrated
- [ ] Documentation updated
- [ ] Ready for production
---
## Support Resources
1. **API Documentation**: `docs/API_ENDPOINTS.md`
2. **Integration Guide**: `docs/API_INTEGRATION_GUIDE.md`
3. **Summary**: `BOT_API_INTEGRATION_SUMMARY.md`
4. **Examples**: `examples/bot_api_usage.py`
5. **Test Script**: `test_api.sh`
---
## Post-Deployment
- [ ] Monitor bot for 24 hours
- [ ] Check error logs daily
- [ ] Test /register and /link commands weekly
- [ ] Review token refresh rates
- [ ] Monitor Redis memory usage
---
**Status**: Ready for deployment ✅
Last Updated: 2025-12-11