This commit is contained in:
@@ -407,7 +407,7 @@ async def oauth_login(_: None, _info: GraphQLResolveInfo, provider: str, callbac
|
|||||||
}
|
}
|
||||||
await store_oauth_state(state, oauth_data)
|
await store_oauth_state(state, oauth_data)
|
||||||
|
|
||||||
# Используем URL из фронтенда для callback - для фронтенда (добавляем слеш если его нет)
|
# Callback должен идти на backend, получаем из base_url (который должен быть backend URL)
|
||||||
oauth_callback_uri = f"{callback_data['base_url'].rstrip('/')}/oauth/{provider}/callback"
|
oauth_callback_uri = f"{callback_data['base_url'].rstrip('/')}/oauth/{provider}/callback"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -537,16 +537,19 @@ async def oauth_login_http(request: Request) -> JSONResponse | RedirectResponse:
|
|||||||
state = token_urlsafe(32)
|
state = token_urlsafe(32)
|
||||||
|
|
||||||
# 🔍 Сохраняем состояние OAuth только в Redis (убираем зависимость от request.session)
|
# 🔍 Сохраняем состояние OAuth только в Redis (убираем зависимость от request.session)
|
||||||
|
# Получаем redirect_uri из query параметров или используем FRONTEND_URL по умолчанию
|
||||||
|
final_redirect_uri = request.query_params.get("redirect_uri", FRONTEND_URL)
|
||||||
oauth_data = {
|
oauth_data = {
|
||||||
"code_verifier": code_verifier,
|
"code_verifier": code_verifier,
|
||||||
"provider": provider,
|
"provider": provider,
|
||||||
"redirect_uri": FRONTEND_URL,
|
"redirect_uri": final_redirect_uri,
|
||||||
"created_at": int(time.time()),
|
"created_at": int(time.time()),
|
||||||
}
|
}
|
||||||
await store_oauth_state(state, oauth_data)
|
await store_oauth_state(state, oauth_data)
|
||||||
|
|
||||||
# URL для callback - для фронтенда (добавляем слеш если его нет)
|
# Получаем backend URL из request
|
||||||
callback_uri = f"{FRONTEND_URL.rstrip('/')}/oauth/{provider}/callback"
|
backend_url = request.url.scheme + "://" + request.url.netloc
|
||||||
|
callback_uri = f"{backend_url}/oauth/{provider}/callback"
|
||||||
|
|
||||||
# 🔍 Создаем redirect URL вручную (обходим использование request.session в authlib)
|
# 🔍 Создаем redirect URL вручную (обходим использование request.session в authlib)
|
||||||
# VK не поддерживает PKCE, используем code_challenge только для поддерживающих провайдеров
|
# VK не поддерживает PKCE, используем code_challenge только для поддерживающих провайдеров
|
||||||
|
|||||||
@@ -1,6 +1,21 @@
|
|||||||
# 🔐 Настройка OAuth Провайдеров
|
# 🔐 Настройка OAuth Провайдеров
|
||||||
|
|
||||||
## 🎯 Быстрая настройка для менеджера
|
## 🎯 Архитектура OAuth
|
||||||
|
|
||||||
|
**Важно понимать разделение:**
|
||||||
|
- **Frontend**: `testing.discours.io` - где пользователь нажимает кнопку входа
|
||||||
|
- **Backend**: `v3.dscrs.site` - где обрабатывается OAuth логика
|
||||||
|
- **Callback URL**: Всегда должен указывать на **backend** (`v3.dscrs.site`)
|
||||||
|
|
||||||
|
## 🔄 OAuth Flow (пошагово):
|
||||||
|
|
||||||
|
1. Пользователь на `testing.discours.io` нажимает "Войти через GitHub"
|
||||||
|
2. Фронтенд редиректит на `v3.dscrs.site/oauth/github`
|
||||||
|
3. Backend редиректит на `github.com` с callback_uri=`v3.dscrs.site/oauth/github/callback`
|
||||||
|
4. GitHub после авторизации редиректит на `v3.dscrs.site/oauth/github/callback`
|
||||||
|
5. Backend обрабатывает callback и редиректит обратно на `testing.discours.io`
|
||||||
|
|
||||||
|
## 🎯 Быстрая настройка
|
||||||
|
|
||||||
### 1. Google OAuth
|
### 1. Google OAuth
|
||||||
|
|
||||||
@@ -109,6 +124,11 @@ heroku config:set GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=yyy
|
|||||||
**Ошибка redirect_uri_mismatch:**
|
**Ошибка redirect_uri_mismatch:**
|
||||||
- Проверить точное соответствие URL в настройках провайдера
|
- Проверить точное соответствие URL в настройках провайдера
|
||||||
- Убедиться что протокол (http/https) совпадает
|
- Убедиться что протокол (http/https) совпадает
|
||||||
|
- **ВАЖНО**: 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`
|
||||||
|
- НЕ указывать frontend URL в настройках провайдера
|
||||||
|
|
||||||
**VK ошибка "Code challenge method is unsupported":**
|
**VK ошибка "Code challenge method is unsupported":**
|
||||||
- Это нормально, VK не поддерживает PKCE
|
- Это нормально, VK не поддерживает PKCE
|
||||||
|
|||||||
Reference in New Issue
Block a user