1+ using  UnityEngine ; 
2+ using  ProjectVG . Infrastructure . Auth . Services ; 
3+ using  ProjectVG . Infrastructure . Auth . Utils ; 
4+ using  ProjectVG . Infrastructure . Auth . Models ; 
5+ 6+ namespace  ProjectVG . Infrastructure . Auth . Examples 
7+ { 
8+  /// <summary> 
9+  /// Guest 로그인 사용 예제 
10+  /// </summary> 
11+  public  class  GuestLoginExample  :  MonoBehaviour 
12+  { 
13+  [ Header ( "Debug UI" ) ] 
14+  public  bool  showDebugUI  =  true ; 
15+ 16+  private  GuestAuthService  _guestAuthService ; 
17+  private  TokenManager  _tokenManager ; 
18+  private  bool  _isLoggingIn  =  false ; 
19+ 20+  private  void  Start ( ) 
21+  { 
22+  InitializeServices ( ) ; 
23+  SetupEventHandlers ( ) ; 
24+ 25+  // 앱 시작 시 자동 게스트 로그인 시도 
26+  CheckAutoGuestLogin ( ) ; 
27+  } 
28+ 29+  private  void  InitializeServices ( ) 
30+  { 
31+  _guestAuthService  =  GuestAuthService . Instance ; 
32+  _tokenManager  =  TokenManager . Instance ; 
33+ 34+  Debug . Log ( "[GuestLoginExample] 서비스 초기화 완료" ) ; 
35+  } 
36+ 37+  private  void  SetupEventHandlers ( ) 
38+  { 
39+  // Guest 로그인 이벤트 구독 
40+  _guestAuthService . OnGuestLoginSuccess  +=  HandleGuestLoginSuccess ; 
41+  _guestAuthService . OnGuestLoginFailed  +=  HandleGuestLoginFailed ; 
42+ 43+  // Token 이벤트 구독 
44+  _tokenManager . OnTokensUpdated  +=  HandleTokensUpdated ; 
45+  _tokenManager . OnTokensExpired  +=  HandleTokensExpired ; 
46+  } 
47+ 48+  private  async  void  CheckAutoGuestLogin ( ) 
49+  { 
50+  // 이미 유효한 토큰이 있으면 자동 로그인 스킵 
51+  if  ( _tokenManager . HasValidTokens ) 
52+  { 
53+  Debug . Log ( "[GuestLoginExample] 유효한 토큰 존재 - 자동 로그인 스킵" ) ; 
54+  return ; 
55+  } 
56+ 57+  // RefreshToken이 있으면 자동 갱신 대기 
58+  if  ( _tokenManager . HasRefreshToken  &&  ! _tokenManager . IsRefreshTokenExpired ( ) ) 
59+  { 
60+  Debug . Log ( "[GuestLoginExample] RefreshToken 존재 - 자동 갱신 대기" ) ; 
61+  return ; 
62+  } 
63+ 64+  // Guest 로그인 가능하면 자동 로그인 시도 
65+  if  ( _guestAuthService . CanLoginAsGuest ( ) ) 
66+  { 
67+  Debug . Log ( "[GuestLoginExample] 자동 Guest 로그인 시도" ) ; 
68+  await  PerformGuestLoginAsync ( ) ; 
69+  } 
70+  } 
71+ 72+  /// <summary> 
73+  /// Guest 로그인 수행 
74+  /// </summary> 
75+  public  async  void  PerformGuestLogin ( ) 
76+  { 
77+  await  PerformGuestLoginAsync ( ) ; 
78+  } 
79+ 80+  private  async  System . Threading . Tasks . Task  PerformGuestLoginAsync ( ) 
81+  { 
82+  if  ( _isLoggingIn ) 
83+  { 
84+  Debug . LogWarning ( "[GuestLoginExample] 이미 로그인 진행 중입니다." ) ; 
85+  return ; 
86+  } 
87+ 88+  _isLoggingIn  =  true ; 
89+ 90+  try 
91+  { 
92+  Debug . Log ( "[GuestLoginExample] Guest 로그인 시작" ) ; 
93+ 94+  // 디바이스 정보 출력 
95+  Debug . Log ( $ "[GuestLoginExample] 디바이스 정보: { DeviceIdProvider . GetPlatformInfo ( ) } ") ; 
96+  Debug . Log ( $ "[GuestLoginExample] 디바이스 ID: { MaskString ( _guestAuthService . GetCurrentDeviceId ( ) ) } ") ; 
97+ 98+  // Guest 로그인 수행 
99+  bool  success  =  await  _guestAuthService . LoginAsGuestAsync ( ) ; 
100+ 101+  if  ( success ) 
102+  { 
103+  Debug . Log ( "[GuestLoginExample] Guest 로그인 성공" ) ; 
104+  } 
105+  else 
106+  { 
107+  Debug . LogError ( "[GuestLoginExample] Guest 로그인 실패" ) ; 
108+  } 
109+  } 
110+  catch  ( System . Exception  ex ) 
111+  { 
112+  Debug . LogError ( $ "[GuestLoginExample] Guest 로그인 중 오류: { ex . Message } ") ; 
113+  } 
114+  finally 
115+  { 
116+  _isLoggingIn  =  false ; 
117+  } 
118+  } 
119+ 120+  /// <summary> 
121+  /// 토큰 상태 확인 
122+  /// </summary> 
123+  public  void  CheckTokenStatus ( ) 
124+  { 
125+  Debug . Log ( "=== Token Status ===" ) ; 
126+  Debug . Log ( _tokenManager . GetDebugInfo ( ) ) ; 
127+  Debug . Log ( "===================" ) ; 
128+  } 
129+ 130+  /// <summary> 
131+  /// Guest 로그인 상태 확인 
132+  /// </summary> 
133+  public  void  CheckGuestLoginStatus ( ) 
134+  { 
135+  var  status  =  _guestAuthService . GetGuestLoginStatus ( ) ; 
136+  Debug . Log ( "=== Guest Login Status ===" ) ; 
137+  Debug . Log ( status . GetDebugInfo ( ) ) ; 
138+  Debug . Log ( "==========================" ) ; 
139+  } 
140+ 141+  /// <summary> 
142+  /// 모든 토큰 삭제 (테스트용) 
143+  /// </summary> 
144+  public  void  ClearAllTokens ( ) 
145+  { 
146+  _tokenManager . ClearTokens ( ) ; 
147+  Debug . Log ( "[GuestLoginExample] 모든 토큰 삭제 완료" ) ; 
148+  } 
149+ 150+  /// <summary> 
151+  /// 디바이스 ID 리셋 (테스트용) 
152+  /// </summary> 
153+  public  void  ResetDeviceId ( ) 
154+  { 
155+  _guestAuthService . ResetDeviceId ( ) ; 
156+  Debug . Log ( "[GuestLoginExample] 디바이스 ID 리셋 완료" ) ; 
157+  } 
158+ 159+  #region Event Handlers
160+ 161+  private  void  HandleGuestLoginSuccess ( TokenSet  tokenSet ) 
162+  { 
163+  Debug . Log ( "[GuestLoginExample] Guest 로그인 성공 이벤트 수신" ) ; 
164+  Debug . Log ( $ "[GuestLoginExample] AccessToken 만료: { tokenSet . AccessToken . ExpiresAt } ") ; 
165+  } 
166+ 167+  private  void  HandleGuestLoginFailed ( string  error ) 
168+  { 
169+  Debug . LogError ( $ "[GuestLoginExample] Guest 로그인 실패 이벤트 수신: { error } ") ; 
170+  } 
171+ 172+  private  void  HandleTokensUpdated ( TokenSet  tokenSet ) 
173+  { 
174+  Debug . Log ( "[GuestLoginExample] 토큰 업데이트 이벤트 수신" ) ; 
175+  } 
176+ 177+  private  void  HandleTokensExpired ( ) 
178+  { 
179+  Debug . Log ( "[GuestLoginExample] 토큰 만료 이벤트 수신 - 자동 갱신 시도" ) ; 
180+  } 
181+ 182+  #endregion
183+ 184+  #region Debug UI
185+ 186+  private  void  OnGUI ( ) 
187+  { 
188+  if  ( ! showDebugUI )  return ; 
189+ 190+  GUILayout . BeginArea ( new  Rect ( 10 ,  10 ,  400 ,  600 ) ) ; 
191+  GUILayout . Label ( "=== Guest Login Debug UI ===" ,  GUI . skin . box ) ; 
192+ 193+  // 로그인 버튼 
194+  GUI . enabled  =  ! _isLoggingIn  &&  _guestAuthService . CanLoginAsGuest ( ) ; 
195+  if  ( GUILayout . Button ( _isLoggingIn  ?  "로그인 중..."  :  "Guest 로그인" ) ) 
196+  { 
197+  PerformGuestLogin ( ) ; 
198+  } 
199+  GUI . enabled  =  true ; 
200+ 201+  GUILayout . Space ( 10 ) ; 
202+ 203+  // 상태 확인 버튼들 
204+  if  ( GUILayout . Button ( "토큰 상태 확인" ) ) 
205+  { 
206+  CheckTokenStatus ( ) ; 
207+  } 
208+ 209+  if  ( GUILayout . Button ( "Guest 로그인 상태 확인" ) ) 
210+  { 
211+  CheckGuestLoginStatus ( ) ; 
212+  } 
213+ 214+  GUILayout . Space ( 10 ) ; 
215+ 216+  // 테스트 버튼들 
217+  GUILayout . Label ( "=== 테스트 기능 ===" ,  GUI . skin . box ) ; 
218+ 219+  if  ( GUILayout . Button ( "모든 토큰 삭제" ) ) 
220+  { 
221+  ClearAllTokens ( ) ; 
222+  } 
223+ 224+  if  ( GUILayout . Button ( "디바이스 ID 리셋" ) ) 
225+  { 
226+  ResetDeviceId ( ) ; 
227+  } 
228+ 229+  GUILayout . Space ( 10 ) ; 
230+ 231+  // 현재 상태 표시 
232+  GUILayout . Label ( "=== 현재 상태 ===" ,  GUI . skin . box ) ; 
233+  GUILayout . Label ( $ "로그인 중: { _isLoggingIn } ") ; 
234+  GUILayout . Label ( $ "유효한 토큰: { _tokenManager ? . HasValidTokens  ??  false } ") ; 
235+  GUILayout . Label ( $ "RefreshToken: { _tokenManager ? . HasRefreshToken  ??  false } ") ; 
236+  GUILayout . Label ( $ "Guest 로그인 가능: { _guestAuthService ? . CanLoginAsGuest ( )  ??  false } ") ; 
237+ 238+  GUILayout . EndArea ( ) ; 
239+  } 
240+ 241+  #endregion
242+ 243+  private  string  MaskString ( string  input ) 
244+  { 
245+  if  ( string . IsNullOrEmpty ( input )  ||  input . Length  <  8 ) 
246+  return  "***" ; 
247+  return  $ "{ input . Substring ( 0 ,  4 ) } ****{ input . Substring ( input . Length  -  4 ) } "; 
248+  } 
249+ 250+  private  void  OnDestroy ( ) 
251+  { 
252+  // 이벤트 구독 해제 
253+  if  ( _guestAuthService  !=  null ) 
254+  { 
255+  _guestAuthService . OnGuestLoginSuccess  -=  HandleGuestLoginSuccess ; 
256+  _guestAuthService . OnGuestLoginFailed  -=  HandleGuestLoginFailed ; 
257+  } 
258+ 259+  if  ( _tokenManager  !=  null ) 
260+  { 
261+  _tokenManager . OnTokensUpdated  -=  HandleTokensUpdated ; 
262+  _tokenManager . OnTokensExpired  -=  HandleTokensExpired ; 
263+  } 
264+  } 
265+  } 
266+ } 
0 commit comments