[0.9.23] - 2025-09-23
All checks were successful
Deploy on push / deploy (push) Successful in 7m2s

### Fixed
- 🔧 **OAuth Callback URL**: Исправлено формирование callback URL - добавлен отсутствующий слеш между доменом и путем
- 🔒 **OAuth HTTPS**: Принудительное использование HTTPS для callback URL в продакшне (исправляет ошибку "redirect_uri is not associated")

### Changed
- 🔄 **OAuth Routes**: Возвращены к стандартному формату `/oauth/{provider}` - провайдеры не передают параметр provider в callback
This commit is contained in:
2025-09-24 09:33:02 +03:00
parent d19e753e96
commit 26f28aa35e
3 changed files with 19 additions and 12 deletions

View File

@@ -1,9 +1,10 @@
# Changelog
## [0.9.23] - 2025-09-23
## [0.9.23] - 2025-09-24
### Fixed
- 🔧 **OAuth Callback URL**: Исправлено формирование callback URL - добавлен отсутствующий слеш между доменом и путем
- 🔒 **OAuth HTTPS**: Принудительное использование HTTPS для callback URL в продакшне (исправляет ошибку "redirect_uri is not associated")
### Changed
- 🔄 **OAuth Routes**: Возвращены к стандартному формату `/oauth/{provider}` - провайдеры не передают параметр provider в callback

View File

@@ -407,8 +407,11 @@ async def oauth_login(_: None, _info: GraphQLResolveInfo, provider: str, callbac
}
await store_oauth_state(state, oauth_data)
# Callback должен идти на backend, получаем из base_url (который должен быть backend URL)
oauth_callback_uri = f"{callback_data['base_url'].rstrip('/')}/oauth/{provider}/callback"
# Callback должен идти на backend с принудительным HTTPS для продакшна
base_url = callback_data["base_url"].rstrip("/")
# Принудительно HTTPS
base_url = base_url.replace("http://", "https://")
oauth_callback_uri = f"{base_url}/oauth/{provider}/callback"
try:
return await client.authorize_redirect(
@@ -547,8 +550,9 @@ async def oauth_login_http(request: Request) -> JSONResponse | RedirectResponse:
}
await store_oauth_state(state, oauth_data)
# Получаем backend URL из request
backend_url = request.url.scheme + "://" + request.url.netloc
# Получаем backend URL из request (принудительно HTTPS для продакшна)
scheme = "https" if request.url.netloc != "localhost:8000" else request.url.scheme
backend_url = f"{scheme}://{request.url.netloc}"
callback_uri = f"{backend_url}/oauth/{provider}/callback"
# 🔍 Создаем redirect URL вручную (обходим использование request.session в authlib)

View File

@@ -24,8 +24,8 @@
3. **APIs & Services****Credentials****Create Credentials****OAuth 2.0 Client ID**
4. **Application type**: Web application
5. **Authorized redirect URIs**:
- `https://v3.dscrs.site/oauth/google/callback`
- `http://localhost:3000/oauth/google/callback` (для разработки)
- `https://v3.dscrs.site/oauth/google/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS**
- `http://localhost:8000/oauth/google/callback` (для разработки)
6. Скопировать **Client ID** и **Client Secret**
**Переменные окружения:**
@@ -38,7 +38,7 @@ GOOGLE_CLIENT_SECRET=your_google_client_secret
1. Перейти в [GitHub Developer Settings](https://github.com/settings/developers)
2. **New OAuth App**
3. **Authorization callback URL**: `https://v3.dscrs.site/oauth/github/callback`
3. **Authorization callback URL**: `https://v3.dscrs.site/oauth/github/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS**
4. Скопировать **Client ID** и **Client Secret**
**Переменные окружения:**
@@ -51,7 +51,7 @@ GITHUB_CLIENT_SECRET=your_github_client_secret
1. Перейти в [VK Developers](https://dev.vk.com/apps)
2. **Создать приложение****Веб-сайт**
3. **Настройки****Redirect URI**: `https://v3.dscrs.site/oauth/vk/callback`
3. **Настройки****Redirect URI**: `https://v3.dscrs.site/oauth/vk/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS**
4. Скопировать **ID приложения** и **Защищённый ключ**
**Переменные окружения:**
@@ -65,7 +65,7 @@ VK_CLIENT_SECRET=your_vk_secure_key
1. Перейти в [Facebook Developers](https://developers.facebook.com/)
2. **My Apps****Create App****Consumer**
3. **Facebook Login****Settings**
4. **Valid OAuth Redirect URIs**: `https://v3.dscrs.site/oauth/facebook/callback`
4. **Valid OAuth Redirect URIs**: `https://v3.dscrs.site/oauth/facebook/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS**
5. Скопировать **App ID** и **App Secret**
**Переменные окружения:**
@@ -78,7 +78,7 @@ FACEBOOK_CLIENT_SECRET=your_facebook_app_secret
1. Перейти в [Yandex OAuth](https://oauth.yandex.ru/)
2. **Создать новое приложение**
3. **Callback URI**: `https://v3.dscrs.site/oauth/yandex/callback`
3. **Callback URI**: `https://v3.dscrs.site/oauth/yandex/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS**
4. **Права**: `login:info`, `login:email`, `login:avatar`
5. Скопировать **ID** и **Пароль**
@@ -127,8 +127,10 @@ heroku config:set GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=yyy
- **ВАЖНО**: Callback URL должен указывать на backend (`v3.dscrs.site`), НЕ на frontend (`testing.discours.io`)
**Ошибка "redirect_uri is not associated with this application":**
- Callback URL в настройках провайдера должен быть `v3.dscrs.site/oauth/{provider}/callback`
- Callback URL в настройках провайдера должен быть `https://v3.dscrs.site/oauth/{provider}/callback`
- **ОБЯЗАТЕЛЬНО HTTPS** (не HTTP) для продакшна
- НЕ указывать frontend URL в настройках провайдера
- Проверить что URL в настройках GitHub **точно совпадает** с тем что отправляет код
**VK ошибка "Code challenge method is unsupported":**
- Это нормально, VK не поддерживает PKCE