Skip to content

Commit b5b8342

Browse files
committed
feat: JWT 토큰 저장
This reverts commit 79e4aa0.
1 parent 75c913d commit b5b8342

File tree

7 files changed

+951
-1
lines changed

7 files changed

+951
-1
lines changed

Assets/Infrastructure/Auth/Examples/ServerOAuth2Example.cs

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Assets/Infrastructure/Auth/OAuth2/ServerOAuth2Provider.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ public async Task<TokenSet> RequestTokenAsync(string state)
269269
// 3. TokenSet 생성
270270
var accessTokenModel = new AccessToken(accessToken, expiresIn, "Bearer", "oauth2");
271271
var refreshTokenModel = !string.IsNullOrEmpty(refreshToken)
272-
? new RefreshToken(refreshToken, expiresIn * 2, userId)
272+
? new RefreshToken(refreshToken, expiresIn * 2, userId) // userId를 DeviceId로 사용
273273
: null;
274274

275275
var tokenSet = new TokenSet(accessTokenModel, refreshTokenModel);
@@ -284,6 +284,21 @@ public async Task<TokenSet> RequestTokenAsync(string state)
284284
Debug.Log($"User ID: {userId}");
285285
Debug.Log("=== 토큰 수신 완료 ===");
286286

287+
// TokenManager에 토큰 저장
288+
try
289+
{
290+
Debug.Log("=== 🔐 ServerOAuth2Provider TokenManager 저장 시작 ===");
291+
var tokenManager = TokenManager.Instance;
292+
tokenManager.SaveTokens(tokenSet);
293+
Debug.Log("[ServerOAuth2Provider] TokenManager에 토큰 저장 완료");
294+
Debug.Log("=== TokenManager 저장 완료 ===");
295+
}
296+
catch (Exception ex)
297+
{
298+
Debug.LogError($"[ServerOAuth2Provider] TokenManager 토큰 저장 실패: {ex.Message}");
299+
// 토큰 저장 실패해도 토큰은 반환 (사용자가 직접 저장할 수 있도록)
300+
}
301+
287302
return tokenSet;
288303
}
289304
catch (Exception ex)

0 commit comments

Comments
 (0)