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