|
1 | 1 | import logging |
2 | 2 | import traceback |
3 | | -from typing import Literal |
| 3 | +from typing import Any, Literal |
| 4 | +from urllib.parse import urlparse |
4 | 5 |
|
5 | 6 | from allauth.account.adapter import DefaultAccountAdapter |
| 7 | +from allauth.headless.adapter import DefaultHeadlessAdapter |
6 | 8 | from allauth.socialaccount.adapter import DefaultSocialAccountAdapter |
7 | 9 | from allauth.socialaccount.models import SocialLogin |
8 | 10 | from allauth.socialaccount.providers.base import Provider |
9 | 11 | from core.logger.util.django_helper import get_request_log_data |
| 12 | +from django.conf import settings |
10 | 13 | from django.http.request import HttpRequest |
11 | 14 |
|
12 | 15 | # allauth.socialaccount.providers.base.AuthError 상수의 가능한 값 (UNKNOWN / CANCELLED / DENIED) |
@@ -50,3 +53,33 @@ def on_authentication_error( |
50 | 53 | }, |
51 | 54 | }, |
52 | 55 | ) |
| 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 |
0 commit comments