@@ -17,8 +17,12 @@ public class ServerOAuth2Example : MonoBehaviour
1717 [ Header ( "UI 컴포넌트" ) ]
1818 [ SerializeField ] private Button loginButton ;
1919 [ SerializeField ] private Button logoutButton ;
20+ [ SerializeField ] private Button refreshButton ;
21+ [ SerializeField ] private Button clearButton ;
22+ [ SerializeField ] private Button checkButton ;
2023 [ SerializeField ] private TextMeshProUGUI statusText ;
2124 [ SerializeField ] private TextMeshProUGUI userInfoText ;
25+ [ SerializeField ] private TextMeshProUGUI debugText ;
2226
2327 [ Header ( "설정" ) ]
2428 [ SerializeField ] private ServerOAuth2Config oauth2Config ;
@@ -27,6 +31,8 @@ public class ServerOAuth2Example : MonoBehaviour
2731 private ServerOAuth2Config OAuth2Config => oauth2Config ?? ServerOAuth2Config . Instance ;
2832
2933 private ServerOAuth2Provider _oauth2Provider ;
34+ private TokenManager _tokenManager ;
35+ private TokenRefreshService _refreshService ;
3036 private TokenSet _currentTokenSet ;
3137 private bool _isLoggedIn = false ;
3238
@@ -35,6 +41,7 @@ public class ServerOAuth2Example : MonoBehaviour
3541 private void Start ( )
3642 {
3743 InitializeOAuth2Provider ( ) ;
44+ InitializeTokenServices ( ) ;
3845 SetupEventHandlers ( ) ;
3946 UpdateUI ( ) ;
4047 }
@@ -44,6 +51,23 @@ private void OnDestroy()
4451 // 이벤트 핸들러 해제
4552 if ( loginButton != null ) loginButton . onClick . RemoveAllListeners ( ) ;
4653 if ( logoutButton != null ) logoutButton . onClick . RemoveAllListeners ( ) ;
54+ if ( refreshButton != null ) refreshButton . onClick . RemoveAllListeners ( ) ;
55+ if ( clearButton != null ) clearButton . onClick . RemoveAllListeners ( ) ;
56+ if ( checkButton != null ) checkButton . onClick . RemoveAllListeners ( ) ;
57+
58+ // Token 서비스 이벤트 해제
59+ if ( _tokenManager != null )
60+ {
61+ _tokenManager . OnTokensUpdated -= OnTokensUpdated ;
62+ _tokenManager . OnTokensExpired -= OnTokensExpired ;
63+ _tokenManager . OnTokensCleared -= OnTokensCleared ;
64+ }
65+
66+ if ( _refreshService != null )
67+ {
68+ _refreshService . OnTokenRefreshed -= OnTokenRefreshed ;
69+ _refreshService . OnTokenRefreshFailed -= OnTokenRefreshFailed ;
70+ }
4771 }
4872
4973 #endregion
@@ -92,13 +116,37 @@ private void InitializeOAuth2Provider()
92116 Debug . Log ( _oauth2Provider . GetDebugInfo ( ) ) ;
93117 }
94118
119+ private void InitializeTokenServices ( )
120+ {
121+ _tokenManager = TokenManager . Instance ;
122+ _refreshService = TokenRefreshService . Instance ;
123+
124+ // 이벤트 구독
125+ _tokenManager . OnTokensUpdated += OnTokensUpdated ;
126+ _tokenManager . OnTokensExpired += OnTokensExpired ;
127+ _tokenManager . OnTokensCleared += OnTokensCleared ;
128+ _refreshService . OnTokenRefreshed += OnTokenRefreshed ;
129+ _refreshService . OnTokenRefreshFailed += OnTokenRefreshFailed ;
130+
131+ Debug . Log ( "[ServerOAuth2Example] Token 서비스 초기화 완료" ) ;
132+ }
133+
95134 private void SetupEventHandlers ( )
96135 {
97136 if ( loginButton != null )
98137 loginButton . onClick . AddListener ( ( ) => _ = OnLoginButtonClicked ( ) ) ;
99138
100139 if ( logoutButton != null )
101140 logoutButton . onClick . AddListener ( ( ) => _ = OnLogoutButtonClicked ( ) ) ;
141+
142+ if ( refreshButton != null )
143+ refreshButton . onClick . AddListener ( ( ) => _ = OnRefreshButtonClicked ( ) ) ;
144+
145+ if ( clearButton != null )
146+ clearButton . onClick . AddListener ( OnClearButtonClicked ) ;
147+
148+ if ( checkButton != null )
149+ checkButton . onClick . AddListener ( ( ) => _ = OnCheckButtonClicked ( ) ) ;
102150 }
103151
104152 #endregion
@@ -170,6 +218,9 @@ private async UniTaskVoid OnLogoutButtonClicked()
170218 {
171219 ShowStatus ( "로그아웃 중..." , Color . blue ) ;
172220
221+ // TokenManager에서 토큰 정리
222+ _tokenManager . ClearTokens ( ) ;
223+
173224 // 토큰 정리
174225 _currentTokenSet ? . Clear ( ) ;
175226 _currentTokenSet = null ;
@@ -235,6 +286,124 @@ private async UniTaskVoid StartAutoTokenRefresh()
235286
236287 #endregion
237288
289+ #region Token Management Buttons
290+
291+ private async UniTaskVoid OnRefreshButtonClicked ( )
292+ {
293+ try
294+ {
295+ ShowStatus ( "토큰 갱신 시작..." , Color . yellow ) ;
296+
297+ var success = await _refreshService . ForceRefreshAsync ( ) ;
298+
299+ if ( success )
300+ {
301+ ShowStatus ( "토큰 갱신 성공!" , Color . green ) ;
302+ // 갱신된 토큰으로 현재 토큰 세트 업데이트
303+ _currentTokenSet = _tokenManager . LoadTokens ( ) ;
304+ }
305+ else
306+ {
307+ ShowStatus ( "토큰 갱신 실패" , Color . red ) ;
308+ }
309+
310+ UpdateUI ( ) ;
311+ }
312+ catch ( System . Exception ex )
313+ {
314+ ShowStatus ( $ "토큰 갱신 오류: { ex . Message } ", Color . red ) ;
315+ Debug . LogError ( $ "[ServerOAuth2Example] 토큰 갱신 실패: { ex . Message } ") ;
316+ }
317+ }
318+
319+ private void OnClearButtonClicked ( )
320+ {
321+ try
322+ {
323+ _tokenManager . ClearTokens ( ) ;
324+ _currentTokenSet = null ;
325+ _isLoggedIn = false ;
326+ ShowStatus ( "토큰 삭제 완료" , Color . blue ) ;
327+ UpdateUI ( ) ;
328+ }
329+ catch ( System . Exception ex )
330+ {
331+ ShowStatus ( $ "토큰 삭제 오류: { ex . Message } ", Color . red ) ;
332+ Debug . LogError ( $ "[ServerOAuth2Example] 토큰 삭제 실패: { ex . Message } ") ;
333+ }
334+ }
335+
336+ private async UniTaskVoid OnCheckButtonClicked ( )
337+ {
338+ try
339+ {
340+ ShowStatus ( "토큰 상태 확인 중..." , Color . yellow ) ;
341+
342+ var hasValidToken = await _refreshService . EnsureValidTokenAsync ( ) ;
343+
344+ if ( hasValidToken )
345+ {
346+ ShowStatus ( "유효한 토큰이 있습니다." , Color . green ) ;
347+ // 유효한 토큰으로 현재 토큰 세트 업데이트
348+ _currentTokenSet = _tokenManager . LoadTokens ( ) ;
349+ }
350+ else
351+ {
352+ ShowStatus ( "유효한 토큰이 없습니다." , Color . red ) ;
353+ }
354+
355+ UpdateUI ( ) ;
356+ }
357+ catch ( System . Exception ex )
358+ {
359+ ShowStatus ( $ "토큰 확인 오류: { ex . Message } ", Color . red ) ;
360+ Debug . LogError ( $ "[ServerOAuth2Example] 토큰 확인 실패: { ex . Message } ") ;
361+ }
362+ }
363+
364+ #endregion
365+
366+ #region Token Events
367+
368+ private void OnTokensUpdated ( TokenSet tokenSet )
369+ {
370+ Debug . Log ( "[ServerOAuth2Example] 토큰 업데이트됨" ) ;
371+ _currentTokenSet = tokenSet ;
372+ UpdateUI ( ) ;
373+ }
374+
375+ private void OnTokensExpired ( )
376+ {
377+ Debug . Log ( "[ServerOAuth2Example] 토큰 만료됨" ) ;
378+ ShowStatus ( "토큰이 만료되었습니다." , Color . red ) ;
379+ UpdateUI ( ) ;
380+ }
381+
382+ private void OnTokensCleared ( )
383+ {
384+ Debug . Log ( "[ServerOAuth2Example] 토큰 삭제됨" ) ;
385+ _currentTokenSet = null ;
386+ _isLoggedIn = false ;
387+ ShowStatus ( "토큰이 삭제되었습니다." , Color . blue ) ;
388+ UpdateUI ( ) ;
389+ }
390+
391+ private void OnTokenRefreshed ( string newAccessToken )
392+ {
393+ Debug . Log ( "[ServerOAuth2Example] 토큰 갱신 성공" ) ;
394+ ShowStatus ( "토큰 갱신 성공!" , Color . green ) ;
395+ UpdateUI ( ) ;
396+ }
397+
398+ private void OnTokenRefreshFailed ( string error )
399+ {
400+ Debug . Log ( $ "[ServerOAuth2Example] 토큰 갱신 실패: { error } ") ;
401+ ShowStatus ( $ "토큰 갱신 실패: { error } ", Color . red ) ;
402+ UpdateUI ( ) ;
403+ }
404+
405+ #endregion
406+
238407 #region UI Management
239408
240409 private void UpdateUI ( )
@@ -244,12 +413,24 @@ private void UpdateUI()
244413
245414 if ( logoutButton != null )
246415 logoutButton . interactable = _isLoggedIn ;
416+
417+ if ( refreshButton != null )
418+ refreshButton . interactable = _isLoggedIn ;
419+
420+ if ( clearButton != null )
421+ clearButton . interactable = _isLoggedIn ;
422+
423+ if ( checkButton != null )
424+ checkButton . interactable = true ; // 항상 활성화
247425 }
248426
249427 private void SetButtonsEnabled ( bool enabled )
250428 {
251429 if ( loginButton != null ) loginButton . interactable = enabled && ! _isLoggedIn ;
252430 if ( logoutButton != null ) logoutButton . interactable = enabled && _isLoggedIn ;
431+ if ( refreshButton != null ) refreshButton . interactable = enabled && _isLoggedIn ;
432+ if ( clearButton != null ) clearButton . interactable = enabled && _isLoggedIn ;
433+ if ( checkButton != null ) checkButton . interactable = enabled ;
253434 }
254435
255436 private void ShowStatus ( string message , Color color )
@@ -276,6 +457,16 @@ private void DisplayTokenInfo()
276457 info += $ "갱신 필요: { _currentTokenSet . NeedsRefresh ( ) } ";
277458
278459 userInfoText . text = info ;
460+
461+ // 디버그 정보도 업데이트
462+ if ( debugText != null )
463+ {
464+ var debugInfo = "=== TokenManager 상태 ===\n " ;
465+ debugInfo += _tokenManager . GetDebugInfo ( ) ;
466+ debugInfo += "\n === TokenRefreshService 상태 ===\n " ;
467+ debugInfo += _refreshService . GetDebugInfo ( ) ;
468+ debugText . text = debugInfo ;
469+ }
279470 }
280471
281472 /// <summary>
@@ -333,6 +524,11 @@ private void ClearUserInfo()
333524 {
334525 userInfoText . text = "로그인하여 토큰 정보를 확인하세요." ;
335526 }
527+
528+ if ( debugText != null )
529+ {
530+ debugText . text = "토큰 정보가 없습니다." ;
531+ }
336532 }
337533
338534 #endregion
0 commit comments