Skip to content

Commit 7dc9e7b

Browse files
committed
feat: 로그인 오류 시 적절한 프론트로 동적으로 리다이렉트하도록 수정
1 parent 797b321 commit 7dc9e7b

2 files changed

Lines changed: 36 additions & 4 deletions

File tree

app/core/authn/allauth_adapter.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import logging
22
import traceback
3-
from typing import Literal
3+
from typing import Any, Literal
4+
from urllib.parse import urlparse
45

56
from allauth.account.adapter import DefaultAccountAdapter
7+
from allauth.headless.adapter import DefaultHeadlessAdapter
68
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
79
from allauth.socialaccount.models import SocialLogin
810
from allauth.socialaccount.providers.base import Provider
911
from core.logger.util.django_helper import get_request_log_data
12+
from django.conf import settings
1013
from django.http.request import HttpRequest
1114

1215
# allauth.socialaccount.providers.base.AuthError 상수의 가능한 값 (UNKNOWN / CANCELLED / DENIED)
@@ -50,3 +53,33 @@ def on_authentication_error(
5053
},
5154
},
5255
)
56+
57+
58+
def _to_origin(value: str) -> str | None:
59+
if not value:
60+
return None
61+
parsed = urlparse(value if "://" in value else f"https://{value}")
62+
if not parsed.netloc:
63+
return None
64+
return f"{parsed.scheme or 'https'}://{parsed.netloc}"
65+
66+
67+
def _allowed_frontend_origins() -> tuple[str, ...]:
68+
return tuple(o for url in settings.FRONTEND_DOMAIN.main if (o := _to_origin(url)))
69+
70+
71+
class PyConKRHeadlessAdapter(DefaultHeadlessAdapter):
72+
def get_frontend_url(self, urlname: str, **kwargs: Any) -> str | None:
73+
if urlname != "socialaccount_login_error":
74+
return super().get_frontend_url(urlname, **kwargs)
75+
76+
allowed = _allowed_frontend_origins()
77+
origin: str | None = None
78+
for header in ("HTTP_X_FRONTEND_DOMAIN", "HTTP_ORIGIN", "HTTP_REFERER"):
79+
if (candidate := _to_origin(self.request.META.get(header))) and candidate in allowed:
80+
origin = candidate
81+
break
82+
83+
if not origin:
84+
origin = next(iter(allowed), "")
85+
return f"{origin}/account/sign-in" if origin else None

app/core/settings.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,9 +261,8 @@
261261
}
262262

263263
HEADLESS_ONLY = True
264-
HEADLESS_FRONTEND_URLS = {
265-
"socialaccount_login_error": env("HEADLESS_SOCIALACCOUNT_LOGIN_ERROR_URL", default=""),
266-
}
264+
HEADLESS_ADAPTER = "core.authn.allauth_adapter.PyConKRHeadlessAdapter"
265+
HEADLESS_FRONTEND_URLS: dict[str, str] = {}
267266

268267

269268
# Internationalization

0 commit comments

Comments
 (0)