
    Ci              	           d Z ddlZddlZddlZddlZddlZddedefdZ	 	 	 ddedededefd	Z	d
edefdZ
	 	 dd
ededefdZddZedk(  r e        yy)u%  
setup_auth.py - Firebase Auth 인증 세션 관리

Firebase Admin SDK로 custom token을 생성하고,
Playwright 브라우저에서 signInWithCustomToken을 호출하여 인증 세션을 저장합니다.

Usage:
    python3 setup_auth.py [--output auth/storageState.json] [--uid test-user]
    Nuidreturnc                    	 ddl }ddl m}m} 	 |j                         }|j#                  | |      }t%        |t&              r|j)                  d	      S t+        |      S # t        $ r t	        dt
        j                         Y yw xY w# t        $ rw t        j                  j                  dd      }|r1t        j                  j                  |      r|j                  |      }n|j                         }|j!                  |      }Y w xY w)
u*   Firebase Admin SDK로 custom token 생성.r   N)authcredentialsu;   firebase-admin 패키지 필요: pip install firebase-adminfile GOOGLE_APPLICATION_CREDENTIALS)apputf-8)firebase_adminr   r   ImportErrorprintsysstderrget_app
ValueErrorosenvirongetpathisfileCertificateApplicationDefaultinitialize_appcreate_custom_token
isinstancebytesdecodestr)r   r   firebase_authr   r   	cred_pathcredcustom_tokens           6/home/jay/workspace/teams/shared/qc/auth/setup_auth.pyr   r      s    E2$$& !44Sc4BL,&""7++|%  KRUR\R\]  2JJNN#CRH		2**95D113D++D12s#   A B $BBA=DDbase_urlr%   output_pathc                 r   |sAt         j                  j                  t         j                  j                  t              d      }	 ddlm} t        j                  t         j                  j                  t         j                  j                  |            d        |       5 }|j                  j                  d	      }|j                         }|j!                         }|j#                  |        |j%                  d
       |r&|j'                  d| d       |j)                  d       |j+                  |       |j-                          |j-                          ddd       t         j                  j/                  |      S # t        $ r t        dt        j                         Y yw xY w# 1 sw Y   RxY w)uL   Playwright로 Firebase signInWithCustomToken 호출 후 storageState 저장.storageState.jsonr   )sync_playwrightu3   playwright 패키지 필요: pip install playwrightr   FT)exist_ok)headlessnetworkidlezasync () => {
                const { getAuth, signInWithCustomToken } = await import('firebase/auth');
                const auth = getAuth();
                await signInWithCustomToken(auth, 'z');
            }i  )r   N)r   r   joindirname__file__playwright.sync_apir+   r   r   r   r   makedirsabspathchromiumlaunchnew_contextnew_pagegotowait_for_load_stateevaluatewait_for_timeoutstorage_statecloser   )r'   r%   r(   r+   pbrowsercontextpages           r&   save_storage_staterC   -   sY    ggll277??8#<>QR7
 KK <=M		 a**##T#2%%'!		(  / MM 4 5A> B 
 !!$';/'* 77>>+&&7  C#**U s   F #B9F-$F*)F*-F6storage_state_pathc                    t         j                  j                  |       sy	 t        | dd      5 }t	        j
                  |      }ddd       dv xs d|v S # 1 sw Y   xY w# t        j                  t        f$ r Y yw xY w)u.   storageState.json 존재 및 유효성 확인.Frr   )encodingNcookiesorigins)r   r   r   openjsonloadJSONDecodeErrorOSError)rD   fdatas      r&   verify_storage_staterQ   V   s    77>>,-$cG< 	 99Q<D	 D 5I$55	  	    '* s(   A$ AA$ A!A$ $B ?B max_age_minutesc                 D   | sAt         j                  j                  t         j                  j                  t              d      } t         j                  j                  |       syt         j                  j                  |       }t        j                         |z
  }||dz  k\  S )u   storageState.json의 TTL 확인. 갱신 필요하면 True 반환.

    - 파일 없으면 True
    - mtime이 max_age_minutes 이상이면 True (갱신 필요)
    - 아직 유효하면 False
    r*   T<   )r   r   r/   r0   r1   r   getmtimetime)rD   rR   mtimeelapseds       r&   check_and_refresh_ttlrY   b   ss     WW\\"''//(*CEXY77>>,-GG/0EiikE!Go***    c                  \   t        j                  d      } | j                  ddd       | j                  ddd	       | j                  d
dd       | j                  ddd       | j                  ddd       | j                         }|j                  xsA t
        j                  j                  t
        j                  j                  t              d      }|j                  r.t        |      }|s t        d       t        j                  d       |j                  rEt!        |      }t        t#        j$                  ||d             t        j                  |rdnd       t        d|j&                   d       t)        |j&                        }|s0t        dt        j*                         t        j                  d       t        d|        t-        |j.                  ||      }|rt        d |        y t        d!t        j*                         t        j                  d       y )"Nu   Firebase Auth 세션 관리)descriptionz--outputr
   u   storageState.json 출력 경로)defaulthelpz--uidtest-qc-userzFirebase UIDz
--base-urlhttp://localhost:3000u   앱 기본 URLz--verify-only
store_trueu'   기존 storageState 유효성만 확인)actionr^   z	--refreshu0   TTL 확인 후 만료 시 storageState 재생성r*   )rD   z([setup_auth] storageState is still validr   )validr      u*   [setup_auth] Custom token 생성 중 (uid=z)...)r   uh   [setup_auth] Custom token 생성 실패. GOOGLE_APPLICATION_CREDENTIALS 환경변수를 확인하세요.r   u&   [setup_auth] storageState 저장 중: )r'   r%   r(   u   [setup_auth] 완료: u   [setup_auth] 실패)argparseArgumentParseradd_argument
parse_argsoutputr   r   r/   r0   r1   refreshrY   r   r   exitverify_onlyrQ   rK   dumpsr   r   r   rC   r'   )parserargsr(   needs_refreshoktokens         r&   mainrs   w   s   $$1NOF

B5VW
nM
.EL\]
Clm
L?qrD++]bggooh.GI\!]K||-M<=HHQK!+.djj2{;<=ba 	6txxj
EFDHH-Ev	
 		2;-
@A	
B 
%k]34##**5rZ   __main__)r_   )r`   r
   r
   )r
   2   )r   N)__doc__re   rK   r   r   rV   r!   r   boolrC   rQ   intrY   rs   __name__ rZ   r&   <module>r{      s      	 
 S c 6 ,&'&'&' &' 
	&'R	S 	T 	 !+++ 
+**Z zF rZ   