From 96e3af92a2781eb45110de25d60d5352bad68183 Mon Sep 17 00:00:00 2001 From: whqtker Date: Sat, 1 Aug 2026 22:09:25 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20dev=20=EA=B3=84=EC=A0=95=20?= =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=20=ED=8C=90=EB=B3=84=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99=EC=9D=84=20=EC=8B=A4=EC=A0=9C=20=EA=B3=84=EC=A0=95(de?= =?UTF-8?q?v@solid-connection.com)=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #615에서 dev/prod 판별 규칙을 서브도메인(@dev.solid-connection.com)으로 가정하고 구현했으나, 실제 dev 관리자 계정은 dev@solid-connection.com (로컬파트가 정확히 "dev")이라 패턴이 안 맞아 dev 계정 로그인이 prod API로 전송되어 401이 발생했다. 로컬파트 정확히 일치로 판별 규칙을 수정하고, #613에서 재작성된 auth.test.ts의 mock 예시도 실제 이메일에 맞춰 갱신했다. --- apps/admin/src/lib/api/auth.test.ts | 6 +++--- apps/admin/src/lib/auth/environment.test.ts | 14 +++++++------- apps/admin/src/lib/auth/environment.ts | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/admin/src/lib/api/auth.test.ts b/apps/admin/src/lib/api/auth.test.ts index 1d56ad3e..6a49e4e6 100644 --- a/apps/admin/src/lib/api/auth.test.ts +++ b/apps/admin/src/lib/api/auth.test.ts @@ -32,7 +32,7 @@ vi.mock("axios", () => ({ vi.mock("@/lib/auth/environment", () => ({ getApiBaseUrlForEnvironment: (environment: string) => environment === "dev" ? "https://api.stage.solid-connection.com" : "https://api.solid-connection.com", - resolveEnvironmentFromEmail: (email: string) => (email.endsWith("@dev.solid-connection.com") ? "dev" : "prod"), + resolveEnvironmentFromEmail: (email: string) => (email === "dev@solid-connection.com" ? "dev" : "prod"), })); vi.mock("@/lib/env", () => ({ @@ -64,13 +64,13 @@ describe("어드민 인증 API", () => { it("어드민 전용 로그인 API를 이메일 환경에 맞춰 호출한다", async () => { post.mockResolvedValue({ data: { accessToken: "access-token" } }); - await adminSignInApi("admin@dev.solid-connection.com", "password"); + await adminSignInApi("dev@solid-connection.com", "password"); expect(removeAccessToken).toHaveBeenCalledOnce(); expect(saveAdminApiEnvironment).toHaveBeenCalledWith("dev"); expect(post).toHaveBeenCalledWith( "/admin/auth/sign-in", - { email: "admin@dev.solid-connection.com", password: "password" }, + { email: "dev@solid-connection.com", password: "password" }, { baseURL: "https://api.stage.solid-connection.com" }, ); }); diff --git a/apps/admin/src/lib/auth/environment.test.ts b/apps/admin/src/lib/auth/environment.test.ts index df95ee3b..e081fb4d 100644 --- a/apps/admin/src/lib/auth/environment.test.ts +++ b/apps/admin/src/lib/auth/environment.test.ts @@ -2,21 +2,21 @@ import { describe, expect, it } from "vitest"; import { getApiBaseUrlForEnvironment, resolveEnvironmentFromEmail } from "./environment"; describe("resolveEnvironmentFromEmail", () => { - it("dev 도메인 이메일은 dev 환경으로 판별한다", () => { - expect(resolveEnvironmentFromEmail("admin@dev.solid-connection.com")).toBe("dev"); + it("dev 계정 이메일(dev@solid-connection.com)은 dev 환경으로 판별한다", () => { + expect(resolveEnvironmentFromEmail("dev@solid-connection.com")).toBe("dev"); }); it("대소문자와 앞뒤 공백을 무시하고 판별한다", () => { - expect(resolveEnvironmentFromEmail(" Admin@Dev.Solid-Connection.Com ")).toBe("dev"); + expect(resolveEnvironmentFromEmail(" Dev@Solid-Connection.Com ")).toBe("dev"); }); - it("dev 도메인이 아닌 이메일은 prod 환경으로 판별한다", () => { + it("dev 계정 이메일이 아닌 이메일은 prod 환경으로 판별한다", () => { expect(resolveEnvironmentFromEmail("admin@solid-connection.com")).toBe("prod"); }); - it("dev 도메인을 부분 문자열로만 포함하는 이메일은 prod로 판별한다", () => { - expect(resolveEnvironmentFromEmail("admin@notdev.solid-connection.com")).toBe("prod"); - expect(resolveEnvironmentFromEmail("admin@dev.solid-connection.com.evil.com")).toBe("prod"); + it("로컬파트가 dev로 시작하지만 정확히 일치하지 않는 이메일은 prod로 판별한다", () => { + expect(resolveEnvironmentFromEmail("dev2@solid-connection.com")).toBe("prod"); + expect(resolveEnvironmentFromEmail("dev@notsolid-connection.com")).toBe("prod"); }); }); diff --git a/apps/admin/src/lib/auth/environment.ts b/apps/admin/src/lib/auth/environment.ts index 6d5a4450..4ac54ff9 100644 --- a/apps/admin/src/lib/auth/environment.ts +++ b/apps/admin/src/lib/auth/environment.ts @@ -1,6 +1,6 @@ export type AdminApiEnvironment = "dev" | "prod"; -const DEV_EMAIL_DOMAIN = "dev.solid-connection.com"; +const DEV_ACCOUNT_EMAIL = "dev@solid-connection.com"; const API_BASE_URLS: Record = { dev: "https://api.stage.solid-connection.com", @@ -9,7 +9,7 @@ const API_BASE_URLS: Record = { export const resolveEnvironmentFromEmail = (email: string): AdminApiEnvironment => { const normalizedEmail = email.trim().toLowerCase(); - return normalizedEmail.endsWith(`@${DEV_EMAIL_DOMAIN}`) ? "dev" : "prod"; + return normalizedEmail === DEV_ACCOUNT_EMAIL ? "dev" : "prod"; }; export const getApiBaseUrlForEnvironment = (environment: AdminApiEnvironment): string => API_BASE_URLS[environment];