# OAuth Test Scenarios для testing.discours.io ## 🧪 Тестовые сценарии для проверки OAuth flow ### 1. ✅ Успешная авторизация GitHub ```bash # Шаг 1: Инициация OAuth curl -v "https://v3.dscrs.site/oauth/github" \ -H "Referer: https://testing.discours.io/some-page" \ -H "User-Agent: Mozilla/5.0" # Ожидаемый результат: # - Редирект 302 на GitHub с правильными параметрами # - state сохранен в Redis с TTL 10 минут # - redirect_uri взят из Referer header # Шаг 2: Callback от GitHub (симуляция) curl -v "https://v3.dscrs.site/oauth/github/callback?code=test_code&state=valid_state" \ -H "User-Agent: Mozilla/5.0" # Ожидаемый результат: # - Обмен code на access_token # - Получение профиля пользователя # - Создание JWT токена # - Установка httpOnly cookie с domain=".discours.io" # - Редирект на https://testing.discours.io/oauth?success=true ``` ### 2. 🚨 Обработка ошибок провайдера ```bash # GitHub отклонил доступ curl -v "https://v3.dscrs.site/oauth/github/callback?error=access_denied&state=valid_state" # Ожидаемый результат: # - Редирект на https://testing.discours.io/oauth?error=access_denied ``` ### 3. 🛡️ CSRF защита (state validation) ```bash # Неправильный state curl -v "https://v3.dscrs.site/oauth/github/callback?code=test_code&state=invalid_state" # Ожидаемый результат: # - Редирект на https://testing.discours.io/oauth?error=oauth_state_expired ``` ### 4. 🔍 Валидация провайдера ```bash # Несуществующий провайдер curl -v "https://v3.dscrs.site/oauth/invalid_provider" # Ожидаемый результат: # - JSON ответ с ошибкой {"error": "Invalid provider"} ``` ### 5. 🍪 Проверка cookie установки ```bash # Проверка что cookie устанавливается правильно curl -v "https://v3.dscrs.site/oauth/github/callback?code=valid_code&state=valid_state" \ -c cookies.txt # Проверить в cookies.txt: # - session_token cookie # - HttpOnly=true # - Secure=true # - SameSite=Lax # - Domain=.discours.io ``` ### 6. 🌐 CORS проверка ```bash # Preflight запрос curl -v "https://v3.dscrs.site/oauth/github" \ -X OPTIONS \ -H "Origin: https://testing.discours.io" \ -H "Access-Control-Request-Method: GET" # Ожидаемый результат: # - Access-Control-Allow-Origin: https://testing.discours.io # - Access-Control-Allow-Credentials: true ``` ### 7. 🔄 Полный E2E тест ```bash #!/bin/bash # Полный тест OAuth flow echo "🔄 Тестируем полный OAuth flow..." # 1. Инициация INIT_RESPONSE=$(curl -s -D headers1.txt "https://v3.dscrs.site/oauth/github" \ -H "Referer: https://testing.discours.io/test-page") # Извлекаем Location header для получения state GITHUB_URL=$(grep -i "location:" headers1.txt | cut -d' ' -f2 | tr -d '\r') STATE=$(echo "$GITHUB_URL" | grep -o 'state=[^&]*' | cut -d'=' -f2) echo "✅ State получен: $STATE" # 2. Симуляция callback CALLBACK_RESPONSE=$(curl -s -D headers2.txt \ "https://v3.dscrs.site/oauth/github/callback?code=test_code&state=$STATE") # Проверяем редирект REDIRECT_URL=$(grep -i "location:" headers2.txt | cut -d' ' -f2 | tr -d '\r') echo "✅ Redirect URL: $REDIRECT_URL" # Проверяем cookie COOKIE=$(grep -i "set-cookie:" headers2.txt | grep "session_token") echo "✅ Cookie установлен: $COOKIE" if [[ "$REDIRECT_URL" == *"testing.discours.io/oauth?success=true"* ]]; then echo "🎉 OAuth flow работает корректно!" else echo "❌ OAuth flow не работает" exit 1 fi ``` ## 🔧 Настройки провайдеров для тестирования ### GitHub OAuth App ``` Application name: Discours Testing Homepage URL: https://testing.discours.io Authorization callback URL: https://v3.dscrs.site/oauth/github/callback ``` ### Google OAuth Client ``` Authorized JavaScript origins: https://testing.discours.io Authorized redirect URIs: https://v3.dscrs.site/oauth/google/callback ``` ### Environment Variables ```bash # Для тестирования нужны эти переменные: GITHUB_CLIENT_ID=your_github_client_id GITHUB_CLIENT_SECRET=your_github_client_secret GOOGLE_CLIENT_ID=your_google_client_id GOOGLE_CLIENT_SECRET=your_google_client_secret # Redis для state storage REDIS_URL=redis://localhost:6379 # Frontend URL FRONTEND_URL=https://testing.discours.io ``` ## 🐛 Возможные проблемы и решения ### 1. Cookie не устанавливается **Проблема**: Domain mismatch между v3.dscrs.site и testing.discours.io **Решение**: Используется domain=".discours.io" для поддержки поддоменов ### 2. CORS ошибки **Проблема**: Браузер блокирует запросы между доменами **Решение**: allow_credentials=True в CORS настройках ### 3. State expired **Проблема**: Redis state истекает через 10 минут **Решение**: Увеличить TTL или оптимизировать flow ### 4. Provider not configured **Проблема**: Отсутствуют CLIENT_ID/CLIENT_SECRET **Решение**: Проверить environment variables ## 📊 Метрики успешности - ✅ Успешная авторизация: > 95% - ✅ CSRF защита: 100% блокировка invalid state - ✅ Cookie безопасность: HttpOnly + Secure + SameSite - ✅ Error handling: Все ошибки редиректят на фронт - ✅ Performance: < 2 секунд на полный flow