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