diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor index fe0710b..1524f6c 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Login.razor @@ -1,6 +1,6 @@ @page "/admin/login" @layout TaxBaik.WasmClient.Components.Admin.Layout.BlankLayout @attribute [AllowAnonymous] -@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) +@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: true)) 로그인 - + diff --git a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginFormNative.razor b/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginFormNative.razor deleted file mode 100644 index 07d40b6..0000000 --- a/src/TaxBaik.Web.Client/Components/Admin/Shared/AdminLoginFormNative.razor +++ /dev/null @@ -1,141 +0,0 @@ -@using System.Text.Json -@inject ILocalStorageService LocalStorageService -@inject NavigationManager Navigation -@inject ISnackbar Snackbar -@inject HttpClient Http -@inject AuthenticationStateProvider AuthStateProvider - - - -@code { - private MudForm? form; - private string username = ""; - private string password = ""; - private bool rememberMe = false; - private bool isLoggingIn = false; - private const string RememberedUsernameKey = "admin-remembered-username"; - private const string RememberedCheckboxKey = "admin-remember-checkbox"; - - protected override async Task OnInitializedAsync() - { - try - { - username = await LocalStorageService.GetItemAsStringAsync(RememberedUsernameKey) ?? ""; - var checkboxValue = await LocalStorageService.GetItemAsStringAsync(RememberedCheckboxKey) ?? "false"; - rememberMe = checkboxValue == "true" && !string.IsNullOrEmpty(username); - } - catch - { - username = ""; - rememberMe = false; - } - } - - private async Task HandleLogin() - { - if (form == null || isLoggingIn) return; - - await form.Validate(); - if (!form.IsValid) return; - - isLoggingIn = true; - try - { - var response = await Http.PostAsJsonAsync("/api/auth/login", new { username, password }); - if (!response.IsSuccessStatusCode) - { - Snackbar.Add("로그인 실패: 사용자명 또는 비밀번호가 올바르지 않습니다", Severity.Error); - return; - } - - var json = await response.Content.ReadAsStringAsync(); - var loginResponse = JsonSerializer.Deserialize(json); - if (loginResponse == null || string.IsNullOrEmpty(loginResponse.AccessToken)) - { - Snackbar.Add("로그인 실패: 응답 오류", Severity.Error); - return; - } - - // 로컬 저장소 저장 - await LocalStorageService.SetItemAsStringAsync("accessToken", loginResponse.AccessToken); - await LocalStorageService.SetItemAsStringAsync("refreshToken", loginResponse.RefreshToken ?? ""); - var expiryTicks = DateTimeOffset.UtcNow.AddSeconds(loginResponse.ExpiresIn).UtcTicks; - await LocalStorageService.SetItemAsStringAsync("tokenExpiry", expiryTicks.ToString()); - - // 아이디 저장 - if (rememberMe) - { - await LocalStorageService.SetItemAsStringAsync(RememberedUsernameKey, username); - await LocalStorageService.SetItemAsStringAsync(RememberedCheckboxKey, "true"); - } - else - { - await LocalStorageService.RemoveItemAsync(RememberedUsernameKey); - await LocalStorageService.RemoveItemAsync(RememberedCheckboxKey); - } - - // Blazor 인증 상태 업데이트 (직접 호출) - if (AuthStateProvider is CustomAuthenticationStateProvider customProvider) - { - await customProvider.LoginAsync(loginResponse.AccessToken, loginResponse.RefreshToken ?? "", loginResponse.ExpiresIn); - } - - // 대시보드로 이동 - Navigation.NavigateTo("/admin/dashboard", replace: true); - } - catch (Exception ex) - { - Snackbar.Add($"로그인 중 오류: {ex.Message}", Severity.Error); - } - finally - { - isLoggingIn = false; - } - } - - private class LoginResponse - { - public string AccessToken { get; set; } = ""; - public string RefreshToken { get; set; } = ""; - public int ExpiresIn { get; set; } - } -} diff --git a/src/TaxBaik.Web/wwwroot/js/admin-session.js b/src/TaxBaik.Web/wwwroot/js/admin-session.js index cc25b94..51190f9 100644 --- a/src/TaxBaik.Web/wwwroot/js/admin-session.js +++ b/src/TaxBaik.Web/wwwroot/js/admin-session.js @@ -342,11 +342,11 @@ window.taxbaikAdminSession = { localStorage.removeItem('admin-remember-checkbox'); } - // 토큰 저장 후 현재 페이지 새로고침 - // 이렇게 하면 WASM이 부팅되면서 CustomAuthenticationStateProvider가 localStorage에서 - // 토큰을 복원하고, 그 후 자동으로 인증된 사용자를 대시보드로 리다이렉트함 + // 토큰 저장 후 대시보드로 이동 + // Blazor가 대시보드 페이지를 로드할 때 CustomAuthenticationStateProvider가 + // 자동으로 localStorage에서 토큰을 복원합니다 setTimeout(() => { - window.location.reload(); + window.location.href = '/taxbaik/admin/dashboard'; }, 200); } catch (error) { window.taxbaikAdminSession.traceUiState('admin-login', `submit failed: ${error?.message || 'login failed'}`);