forked from baron/baron-sso
gateway 분리 아키텍처
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user