fix: stabilize admin login and ci versioning
TaxBaik CI/CD / build-and-deploy (push) Failing after 1m40s

This commit is contained in:
2026-07-01 14:24:59 +09:00
parent 6d263c20bf
commit 0f6ba33af3
4 changed files with 43 additions and 66 deletions
+1 -1
View File
@@ -34,7 +34,7 @@
</div>
</div>
<MudThemeProvider @bind-IsDarkMode="isDarkMode" Theme="mudTheme" />
<Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
<Routes @rendermode="new InteractiveServerRenderMode(prerender: true)" />
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
<script src="js/admin-session.js"></script>
<script src="_framework/blazor.web.js"></script>
+42 -9
View File
@@ -1,6 +1,8 @@
@page "/admin/login"
@layout TaxBaik.Web.Components.Admin.Layout.BlankLayout
@attribute [AllowAnonymous]
@rendermode @(new InteractiveServerRenderMode(prerender: true))
@inject IApiClient ApiClient
@inject ILocalStorageService LocalStorageService
@inject IJSRuntime Js
@@ -10,23 +12,23 @@
<MudPaper Class="pa-8" Elevation="3" Style="width: 100%; max-width: 400px;">
<MudText Typo="Typo.h4" Class="mb-6 text-center">관리자 로그인</MudText>
<form id="admin-login-form" method="post" action="/taxbaik/admin/login">
<EditForm Model="model" OnValidSubmit="HandleLogin">
<DataAnnotationsValidator />
<input class="mud-input mud-input-outlined mud-input-root mud-input-root-adorned-start mb-4"
style="width: 100%; min-height: 56px; padding: 16px 14px;"
placeholder="사용자명"
autocomplete="username"
name="username"
value="@model.Username" />
@bind="model.Username" />
<input type="password"
class="mud-input mud-input-outlined mud-input-root mud-input-root-adorned-start mb-4"
style="width: 100%; min-height: 56px; padding: 16px 14px;"
placeholder="비밀번호"
autocomplete="current-password"
name="password" />
@bind="model.Password" />
<div class="mb-4">
<input class="mud-checkbox" type="checkbox" name="rememberMe" />
<input class="mud-checkbox" type="checkbox" @bind="model.RememberMe" />
<label style="margin-left: 8px; cursor: pointer;">아이디 저장</label>
</div>
@@ -37,12 +39,12 @@
style="width: 100%; min-height: 52px; border: 0; border-radius: 4px; color: white;">
<span>로그인</span>
</button>
</form>
</EditForm>
</MudPaper>
</MudContainer>
@code {
private readonly LoginModel model = new();
private LoginModel model = new();
private const string RememberedUsernameKey = "admin-remembered-username";
protected override async Task OnInitializedAsync()
@@ -64,14 +66,45 @@
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await Js.InvokeVoidAsync("taxbaikAdminSession.syncRouteClass");
await Js.InvokeVoidAsync("taxbaikAdminSession.bindLoginForm");
}
private async Task HandleLogin()
{
var request = new { model.Username, model.Password };
var response = await ApiClient.PostAsync<LoginResponse>("auth/login", request);
if (response?.AccessToken == null || response?.RefreshToken == null)
{
return;
}
if (model.RememberMe)
{
await LocalStorageService.SetItemAsStringAsync(RememberedUsernameKey, model.Username);
}
else
{
await LocalStorageService.RemoveItemAsync(RememberedUsernameKey);
}
await Js.InvokeVoidAsync("localStorage.setItem", "accessToken", response.AccessToken);
await Js.InvokeVoidAsync("localStorage.setItem", "refreshToken", response.RefreshToken);
await Js.InvokeVoidAsync("localStorage.setItem", "tokenExpiry", DateTimeOffset.UtcNow.AddSeconds(response.ExpiresIn).ToUnixTimeMilliseconds().ToString());
await Js.InvokeVoidAsync("window.location.assign", "/taxbaik/admin/dashboard");
}
private class LoginModel
{
public string Username { get; set; } = "";
public string Password { get; set; } = "";
public bool RememberMe { get; set; }
}
private class LoginResponse
{
public string AccessToken { get; set; } = "";
public string RefreshToken { get; set; } = "";
public int ExpiresIn { get; set; }
}
}