1
0
forked from baron/baron-sso

gateway 분리 아키텍처

This commit is contained in:
Lectom C Han
2026-01-30 17:55:43 +09:00
parent b39789dbe2
commit 03a78d75ae
2 changed files with 50 additions and 10 deletions

View File

@@ -52,6 +52,23 @@ class AuthProxyService {
}
}
static Future<int> getSessionStatus({String? token, bool useCookie = false}) async {
final url = Uri.parse('$_baseUrl/api/v1/user/me');
final client = createHttpClient(withCredentials: useCookie);
try {
final headers = <String, String>{
'Content-Type': 'application/json',
};
if (!useCookie && token != null && token.isNotEmpty) {
headers['Authorization'] = 'Bearer $token';
}
final response = await client.get(url, headers: headers);
return response.statusCode;
} finally {
client.close();
}
}
static Future<Map<String, dynamic>> initEnchantedLink(
String loginId, {
String? method,

View File

@@ -345,11 +345,28 @@ class _LoginScreenState extends ConsumerState<LoginScreen>
_onLoginSuccess(token, provider: provider);
}
bool _hasLocalSession() {
if (AuthTokenStore.getToken() != null) {
return true;
Future<bool> _hasValidLocalSession() async {
final token = AuthTokenStore.getToken();
final usesCookie = AuthTokenStore.usesCookie();
if (token == null && !usesCookie) {
return false;
}
return AuthTokenStore.usesCookie();
try {
final status = await AuthProxyService.getSessionStatus(
token: token,
useCookie: usesCookie,
);
if (status == 200) {
return true;
}
if (status == 401 || status == 403) {
AuthTokenStore.clear();
}
} catch (e) {
debugPrint("[Auth] 세션 확인 실패: $e");
}
return false;
}
void _markVerificationApproved(
@@ -416,11 +433,10 @@ class _LoginScreenState extends ConsumerState<LoginScreen>
final res = await AuthProxyService.verifyMagicLink(token);
debugPrint("[Auth] Verification successful for token: $token");
final jwt = res['token'] ?? res['sessionJwt'];
final provider = res['provider'] as String?;
final hasLocalSession = _hasLocalSession();
final hasLocalSession = await _hasValidLocalSession();
if (jwt is String && jwt.isNotEmpty) {
if (hasLocalSession) {
if (hasLocalSession) {
_markVerificationApproved(
"승인 되었습니다. 이 기기는 로그인되어 있는 상태입니다. 원격 창도 로그인이 될 예정입니다",
);
@@ -460,7 +476,7 @@ class _LoginScreenState extends ConsumerState<LoginScreen>
final jwt = res['sessionJwt'] ?? res['token'];
final status = res['status']?.toString();
debugPrint("[Auth] Code verification successful for loginId: $sanitizedLoginId");
final hasLocalSession = _hasLocalSession();
final hasLocalSession = await _hasValidLocalSession();
if (jwt == null && status == 'approved') {
if (mounted) {
@@ -476,7 +492,14 @@ class _LoginScreenState extends ConsumerState<LoginScreen>
);
return;
}
_completeLoginFromToken(jwt, provider: res['provider'] as String?);
_markVerificationApproved(
"링크로 로그인 되었습니다. 잠시 후 로그인 화면으로 이동합니다.",
title: '링크 로그인 완료',
pageTitle: '링크 로그인',
actionLabel: '로그인 화면으로 이동',
actionPath: '/signin',
autoRedirect: true,
);
return;
}
@@ -500,7 +523,7 @@ class _LoginScreenState extends ConsumerState<LoginScreen>
final jwt = res['sessionJwt'] ?? res['token'];
final status = res['status']?.toString();
debugPrint("[Auth] Short code verification successful");
final hasLocalSession = _hasLocalSession();
final hasLocalSession = await _hasValidLocalSession();
if (jwt == null && status == 'approved') {
if (mounted) {