### 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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user