배경
관리자 로그인은 현재 supabase.auth.signInWithOAuth({ provider: "google" }) redirect 흐름을 사용한다. 이 방식은 Supabase Auth 기본 도메인을 거치기 때문에 Google 계정 선택 화면에서 uhqoiyyziajwxjecziis.supabase.co(으)로 이동처럼 Supabase 프로젝트 도메인이 노출된다.
참가자 로그인은 이미 Google Identity Services 버튼으로 credential을 받은 뒤 supabase.auth.signInWithIdToken({ provider: "google" })을 호출하는 방식이다. 이 방식은 Google 로그인 화면에서 서비스 맥락을 유지하면서도 최종적으로 Supabase session/JWT를 발급받는다.
관리자 로그인도 참가자 로그인과 같은 Google Identity Services + Supabase signInWithIdToken 흐름으로 전환한다.
결정 사항
- Supabase Pro/custom domain은 이번 해결책으로 사용하지 않는다.
- 관리자 로그인에서 Supabase OAuth redirect 흐름을 제거한다.
- 관리자 로그인도 참가자 로그인처럼 Google Identity Services 버튼을 사용한다.
- Google credential을 Supabase
signInWithIdToken에 전달해 Supabase session/JWT는 유지한다.
- 백엔드가 Google ID token을 직접 검증하거나 자체 auth token을 새로 발급하는 방식은 이번 범위가 아니다.
현재 구조
- 참가자 로그인:
GoogleSignInButton -> supabase.auth.signInWithIdToken() -> ensureBingoGoogleBridge()
- 관리자 로그인:
supabase.auth.signInWithOAuth() -> Supabase OAuth redirect -> Google -> Supabase callback -> admin session 확인
변경 방향
- 관리자 로그인 화면에서 기존
handleGoogleLogin의 signInWithOAuth 호출을 제거한다.
frontend/src/modules/Auth/GoogleSignInButton.tsx를 관리자 로그인에서도 재사용한다.
- Google credential/nonce를 받아
supabase.auth.signInWithIdToken({ provider: "google", token: credential, nonce })를 호출한다.
- 발급된 Supabase session access token으로 기존
getAdminMe()를 호출한다.
- 성공 시 기존처럼
setAdminSession() 후 관리자 콘솔로 이동한다.
- 실패 시 Supabase sign out 및 기존 admin session 정리를 유지한다.
영향 범위
frontend/src/modules/Admin/AdminPortal.tsx
frontend/src/modules/Auth/GoogleSignInButton.tsx 재사용 여부 확인
- admin login 관련 테스트/e2e
- Supabase Google provider 설정은 계속 필요
VITE_GOOGLE_CLIENT_ID, VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY 설정은 계속 필요
수용 기준
- 관리자 로그인에서 Google 계정 선택 화면에 Supabase 프로젝트 도메인이 앱 이름처럼 노출되지 않는다.
- 관리자 로그인도 참가자 로그인과 같은 Google Identity Services UI를 사용한다.
- 로그인 성공 시 기존과 동일하게 Supabase session/JWT가 생성된다.
- 기존
/api/admin/auth/me 기반 관리자 권한 확인 흐름이 유지된다.
- 승인된 관리자 이메일은 로그인 후 관리자 콘솔로 이동한다.
- 권한이 없는 Google 계정은 관리자 콘솔에 접근하지 못하고 명확한 오류를 본다.
- 로그아웃, 세션 복구, 로그인 실패 처리 동작이 기존과 동일하게 유지된다.
참고
배경
관리자 로그인은 현재
supabase.auth.signInWithOAuth({ provider: "google" })redirect 흐름을 사용한다. 이 방식은 Supabase Auth 기본 도메인을 거치기 때문에 Google 계정 선택 화면에서uhqoiyyziajwxjecziis.supabase.co(으)로 이동처럼 Supabase 프로젝트 도메인이 노출된다.참가자 로그인은 이미 Google Identity Services 버튼으로 credential을 받은 뒤
supabase.auth.signInWithIdToken({ provider: "google" })을 호출하는 방식이다. 이 방식은 Google 로그인 화면에서 서비스 맥락을 유지하면서도 최종적으로 Supabase session/JWT를 발급받는다.관리자 로그인도 참가자 로그인과 같은
Google Identity Services + Supabase signInWithIdToken흐름으로 전환한다.결정 사항
signInWithIdToken에 전달해 Supabase session/JWT는 유지한다.현재 구조
GoogleSignInButton->supabase.auth.signInWithIdToken()->ensureBingoGoogleBridge()supabase.auth.signInWithOAuth()-> Supabase OAuth redirect -> Google -> Supabase callback -> admin session 확인변경 방향
handleGoogleLogin의signInWithOAuth호출을 제거한다.frontend/src/modules/Auth/GoogleSignInButton.tsx를 관리자 로그인에서도 재사용한다.supabase.auth.signInWithIdToken({ provider: "google", token: credential, nonce })를 호출한다.getAdminMe()를 호출한다.setAdminSession()후 관리자 콘솔로 이동한다.영향 범위
frontend/src/modules/Admin/AdminPortal.tsxfrontend/src/modules/Auth/GoogleSignInButton.tsx재사용 여부 확인VITE_GOOGLE_CLIENT_ID,VITE_SUPABASE_URL,VITE_SUPABASE_ANON_KEY설정은 계속 필요수용 기준
/api/admin/auth/me기반 관리자 권한 확인 흐름이 유지된다.참고
signInWithIdToken에 넘겨 Supabase session을 만드는 방식을 안내한다.