Google 계정 데이터 별칭 복구를 추가

This commit is contained in:
Yun Chan 2026-08-29 15:34:50 +09:00
parent 15f609368c
commit dba9b75a38
9 changed files with 642 additions and 30 deletions

View file

@ -29,6 +29,7 @@ from ..auth_types import AccountStatus, RoleName
from ..auth_sessions import (
ManagedUser,
get_managed_user,
get_managed_user_by_auth_alias,
get_managed_user_by_email,
has_admin_access,
InactiveUserError,
@ -705,7 +706,10 @@ async def _me_response(user: SessionUser | Principal) -> MeResponse:
)
email = getattr(user, "email", "")
role = user.role.value if isinstance(user.role, Role) else user.role
stored_admin_access = managed.admin_access if managed else getattr(user, "admin_access", False)
stored_admin_access = (
managed.admin_access if managed else getattr(user, "admin_access", False)
)
entitlement_email = managed.email if managed else email
return MeResponse(
user_id=user.user_id,
email=email,
@ -715,8 +719,8 @@ async def _me_response(user: SessionUser | Principal) -> MeResponse:
or email
),
role=role,
admin_access=has_admin_access(email, role, stored_admin_access),
super_admin=is_super_admin_email(email),
admin_access=has_admin_access(entitlement_email, role, stored_admin_access),
super_admin=is_super_admin_email(entitlement_email),
account_status=account_status,
approval_required=account_status != "approved",
cohort_ids=user.cohort_ids,
@ -970,7 +974,17 @@ async def callback(
email_domain=_email_domain(str(claims.get("email") or "")),
)
return _oauth_callback_error("id_token_invalid", request)
managed_user = await get_managed_user_by_email(email)
external_id = _provider_external_id("google", str(claims.get("sub") or ""), email)
try:
aliased_user = await get_managed_user_by_auth_alias(external_id)
except InactiveUserError:
_log_oauth_callback_failure(
request,
"inactive_user",
email_domain=_email_domain(email),
)
return _oauth_callback_error("inactive_user", request)
managed_user = aliased_user or await get_managed_user_by_email(email)
role = _role_for_managed_user(managed_user, _role_for_email(email))
display_name = str(claims.get("name") or email)
cohort_ids = _cohort_ids_for_managed_user(
@ -980,16 +994,26 @@ async def callback(
hosted_domain=str(claims.get("hd") or ""),
),
)
external_id = _provider_external_id("google", str(claims.get("sub") or ""), email)
try:
sid, _ = await create_session(
email=email,
display_name=display_name,
role=role.value,
cohort_ids=cohort_ids,
external_id=external_id,
account_status="approved",
)
if aliased_user is not None:
sid, _ = await create_session(
email=email,
display_name=display_name,
role=role.value,
cohort_ids=cohort_ids,
external_id=external_id,
account_status="approved",
managed_user=aliased_user,
)
else:
sid, _ = await create_session(
email=email,
display_name=display_name,
role=role.value,
cohort_ids=cohort_ids,
external_id=external_id,
account_status="approved",
)
except InactiveUserError:
_log_oauth_callback_failure(
request,