6.6 KiB
6.6 KiB
OAuth Deployment Checklist
🚀 Quick Setup Guide
1. Backend Implementation
# Добавьте в requirements.txt или poetry
redis>=4.0.0
httpx>=0.24.0
pydantic>=2.0.0
2. Environment Variables
# .env file
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
FACEBOOK_APP_ID=your_facebook_app_id
FACEBOOK_APP_SECRET=your_facebook_app_secret
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
VK_APP_ID=your_vk_app_id
VK_APP_SECRET=your_vk_app_secret
YANDEX_CLIENT_ID=your_yandex_client_id
YANDEX_CLIENT_SECRET=your_yandex_client_secret
REDIS_URL=redis://localhost:6379/0
JWT_SECRET=your_super_secret_jwt_key
JWT_EXPIRATION_HOURS=24
3. Database Migration
-- Create oauth_links table
CREATE TABLE oauth_links (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
provider VARCHAR(50) NOT NULL,
provider_id VARCHAR(255) NOT NULL,
provider_data JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(provider, provider_id)
);
CREATE INDEX idx_oauth_links_user_id ON oauth_links(user_id);
CREATE INDEX idx_oauth_links_provider ON oauth_links(provider, provider_id);
4. OAuth Provider Setup
Google OAuth
- Перейти в Google Cloud Console
- Создать новый проект или выбрать существующий
- Включить Google+ API
- Настроить OAuth consent screen
- Создать OAuth 2.0 credentials
- Добавить redirect URIs:
https://your-domain.com/auth/oauth/google/callback
http://localhost:3000/auth/oauth/google/callback
(для разработки)
Facebook OAuth
- Перейти в Facebook Developers
- Создать новое приложение
- Добавить продукт "Facebook Login"
- Настроить Valid OAuth Redirect URIs:
https://your-domain.com/auth/oauth/facebook/callback
GitHub OAuth
- Перейти в GitHub Settings
- Создать новое OAuth App
- Настроить Authorization callback URL:
https://your-domain.com/auth/oauth/github/callback
5. Backend Endpoints (FastAPI example)
# auth/oauth.py
from fastapi import APIRouter, HTTPException, Request
from fastapi.responses import RedirectResponse
router = APIRouter(prefix="/auth/oauth")
@router.get("/{provider}")
async def oauth_redirect(provider: str, state: str, redirect_uri: str):
# Валидация провайдера
if provider not in ["google", "facebook", "github", "vk", "yandex"]:
raise HTTPException(400, "Unsupported provider")
# Сохранение state в Redis
await store_oauth_state(state, redirect_uri)
# Генерация URL провайдера
oauth_url = generate_provider_url(provider, state, redirect_uri)
return RedirectResponse(url=oauth_url)
@router.get("/{provider}/callback")
async def oauth_callback(provider: str, code: str, state: str):
# Проверка state
stored_data = await get_oauth_state(state)
if not stored_data:
raise HTTPException(400, "Invalid state")
# Обмен code на user_data
user_data = await exchange_code_for_user_data(provider, code)
# Создание/поиск пользователя
user = await get_or_create_user_from_oauth(provider, user_data)
# Генерация JWT
access_token = generate_jwt_token(user.id)
# Редирект с токеном
return RedirectResponse(
url=f"{stored_data['redirect_uri']}?state={state}&access_token={access_token}"
)
6. Testing
# Запуск E2E тестов
npm run test:e2e -- oauth.spec.ts
# Проверка OAuth endpoints
curl -X GET "http://localhost:8000/auth/oauth/google?state=test&redirect_uri=http://localhost:3000"
7. Production Deployment
Frontend
- Проверить корректность
coreApiUrl
в production - Добавить обработку ошибок OAuth в UI
- Настроить CSP headers для OAuth редиректов
Backend
- Настроить HTTPS для всех OAuth endpoints
- Добавить rate limiting для OAuth endpoints
- Настроить CORS для фронтенд доменов
- Добавить мониторинг OAuth ошибок
- Настроить логирование OAuth событий
Infrastructure
- Настроить Redis для production
- Добавить health checks для OAuth endpoints
- Настроить backup для oauth_links таблицы
8. Security Checklist
- Все OAuth секреты в environment variables
- State validation с TTL (10 минут)
- CSRF protection включен
- Redirect URI validation
- Rate limiting на OAuth endpoints
- Логирование всех OAuth событий
- HTTPS обязателен в production
9. Monitoring
# Добавить метрики для мониторинга
from prometheus_client import Counter, Histogram
oauth_requests = Counter('oauth_requests_total', 'OAuth requests', ['provider', 'status'])
oauth_duration = Histogram('oauth_duration_seconds', 'OAuth request duration')
@router.get("/{provider}")
async def oauth_redirect(provider: str, state: str, redirect_uri: str):
with oauth_duration.time():
try:
# OAuth logic
oauth_requests.labels(provider=provider, status='success').inc()
except Exception as e:
oauth_requests.labels(provider=provider, status='error').inc()
raise
🔧 Troubleshooting
Частые ошибки
-
"OAuth state mismatch"
- Проверьте TTL Redis
- Убедитесь, что state генерируется правильно
-
"Provider authentication failed"
- Проверьте client_id и client_secret
- Убедитесь, что redirect_uri совпадает с настройками провайдера
-
"Invalid redirect URI"
- Добавьте все возможные redirect URIs в настройки приложения
- Проверьте HTTPS/HTTP в production/development
Логи для отладки
# Backend логи
tail -f /var/log/app/oauth.log | grep "oauth"
# Frontend логи (browser console)
# Фильтр: "[oauth]" или "[SessionProvider]"