diff --git a/devfront/src/features/clients/ClientGeneralPage.tsx b/devfront/src/features/clients/ClientGeneralPage.tsx index ca202477..55a04383 100644 --- a/devfront/src/features/clients/ClientGeneralPage.tsx +++ b/devfront/src/features/clients/ClientGeneralPage.tsx @@ -1892,85 +1892,8 @@ function ClientGeneralPage() { - - -
-
- - {t("ui.dev.clients.general.auto_login.title", "자동 로그인")} - - - {t( - "msg.dev.clients.general.auto_login.subtitle", - "RP가 자체 로그인 시작 URL에서 OIDC 요청을 만들 수 있으면 userfront에서 바로 로그인 진입을 제공합니다.", - )} - -
-
-
-

- {autoLoginSupported - ? t("ui.common.enabled", "사용") - : t("ui.common.disabled", "사용 안 함")} -

-

- {t( - "ui.dev.clients.general.auto_login.supported", - "자동 로그인 지원", - )} -

-
- -
-
-
- -
- - setAutoLoginUrl(event.target.value)} - disabled={!autoLoginSupported} - aria-invalid={!hasValidAutoLoginUrl} - className={!hasValidAutoLoginUrl ? "border-destructive" : ""} - placeholder={t( - "ui.dev.clients.general.auto_login.url_placeholder", - "https://app.example.com/login?auto=1", - )} - /> -

- {t( - "msg.dev.clients.general.auto_login.help", - "이 URL은 RP가 state, nonce, PKCE 값을 직접 생성한 뒤 Baron OIDC로 리다이렉트해야 합니다.", - )} -

- {!hasValidAutoLoginUrl ? ( -

- {t( - "msg.dev.clients.general.auto_login.invalid_url", - "자동 로그인 URL 형식이 올바르지 않습니다. http 또는 https 주소를 입력하세요.", - )} -

- ) : null} -
-
-
- {/* 2. Scopes */} + {/* 3. Custom Claims */}
@@ -2389,229 +2312,6 @@ function ClientGeneralPage() { - - -
-
- - {t( - "ui.dev.clients.general.tenant_access.title", - "테넌트 접근 제한", - )} - -
-

- {t( - "ui.dev.clients.general.tenant_access.subtitle", - "허용된 테넌트만 이 RP에 접근할 수 있도록 제한합니다.", - )} -

-

- {t( - "ui.dev.clients.general.tenant_access.hint", - "제한을 켜면 tenants 스코프가 자동으로 포함되며, 허용 테넌트를 하나 이상 선택해야 합니다.", - )} -

-
-
-
-
-

- {tenantAccessRestricted - ? t( - "ui.dev.clients.general.tenant_access.enabled", - "제한 있음", - ) - : t( - "ui.dev.clients.general.tenant_access.disabled", - "제한 없음", - )} -

-

- {t( - "ui.dev.clients.general.tenant_access.title", - "테넌트 접근 제한", - )} -

-
- -
-
-
- - {tenantAccessRestricted ? ( -
-
- - - handleSelectAllowedTenant(selection.id) - } - /> -
- -
- - - - - - - {t( - "ui.dev.clients.general.tenant_access.table.name", - "테넌트명", - )} - - - {t( - "ui.dev.clients.general.tenant_access.table.slug", - "슬러그", - )} - - - {t( - "ui.dev.clients.general.tenant_access.table.id", - "테넌트 ID", - )} - - - {t( - "ui.dev.clients.general.tenant_access.table.actions", - "작업", - )} - - - - - {selectedAllowedTenants.length > 0 ? ( - <> - {selectedAllowedTenants.map((tenant) => ( - - - - {tenant.name} - - - - {tenant.slug || "-"} - - - {tenant.id} - - -
- - -
-
-
- ))} - {allowedTenantIds - .filter( - (tenantId) => - !selectedAllowedTenants.some( - (tenant) => tenant.id === tenantId, - ), - ) - .map((tenantId) => ( - - - - {tenantId} - - - - - - - - {tenantId} - - -
- - -
-
-
- ))} - - ) : ( - - {t( - "ui.dev.clients.general.tenant_access.selected_empty", - "아직 선택된 테넌트가 없습니다.", - )} - - )} -
-
-
-
-
- ) : null} -
-
-
@@ -3029,7 +2729,310 @@ function ClientGeneralPage() { - {/* 3. Security Settings */} + {/* 4. Tenant Access Restriction */} + + +
+
+ + {t( + "ui.dev.clients.general.tenant_access.title", + "테넌트 접근 제한", + )} + +
+

+ {t( + "ui.dev.clients.general.tenant_access.subtitle", + "허용된 테넌트만 이 RP에 접근할 수 있도록 제한합니다.", + )} +

+

+ {t( + "ui.dev.clients.general.tenant_access.hint", + "제한을 켜면 tenants 스코프가 자동으로 포함되며, 허용 테넌트를 하나 이상 선택해야 합니다.", + )} +

+
+
+
+
+

+ {tenantAccessRestricted + ? t( + "ui.dev.clients.general.tenant_access.enabled", + "제한 있음", + ) + : t( + "ui.dev.clients.general.tenant_access.disabled", + "제한 없음", + )} +

+

+ {t( + "ui.dev.clients.general.tenant_access.title", + "테넌트 접근 제한", + )} +

+
+ +
+
+
+ + {tenantAccessRestricted ? ( +
+
+ + + handleSelectAllowedTenant(selection.id) + } + /> +
+ +
+ + + + + + + {t( + "ui.dev.clients.general.tenant_access.table.name", + "테넌트명", + )} + + + {t( + "ui.dev.clients.general.tenant_access.table.slug", + "슬러그", + )} + + + {t( + "ui.dev.clients.general.tenant_access.table.id", + "테넌트 ID", + )} + + + {t( + "ui.dev.clients.general.tenant_access.table.actions", + "작업", + )} + + + + + {selectedAllowedTenants.length > 0 ? ( + <> + {selectedAllowedTenants.map((tenant) => ( + + + + {tenant.name} + + + + {tenant.slug || "-"} + + + {tenant.id} + + +
+ + +
+
+
+ ))} + {allowedTenantIds + .filter( + (tenantId) => + !selectedAllowedTenants.some( + (tenant) => tenant.id === tenantId, + ), + ) + .map((tenantId) => ( + + + + {tenantId} + + + + - + + + {tenantId} + + +
+ + +
+
+
+ ))} + + ) : ( + + {t( + "ui.dev.clients.general.tenant_access.selected_empty", + "아직 선택된 테넌트가 없습니다.", + )} + + )} +
+
+
+
+
+ ) : null} +
+
+ + {/* 5. Auto Login */} + + +
+
+ + {t("ui.dev.clients.general.auto_login.title", "자동 로그인")} + + + {t( + "msg.dev.clients.general.auto_login.subtitle", + "RP가 자체 로그인 시작 URL에서 OIDC 요청을 만들 수 있으면 userfront에서 바로 로그인 진입을 제공합니다.", + )} + +
+
+
+

+ {autoLoginSupported + ? t("ui.common.enabled", "사용") + : t("ui.common.disabled", "사용 안 함")} +

+

+ {t( + "ui.dev.clients.general.auto_login.supported", + "자동 로그인 지원", + )} +

+
+ +
+
+
+ +
+ + setAutoLoginUrl(event.target.value)} + disabled={!autoLoginSupported} + aria-invalid={!hasValidAutoLoginUrl} + className={!hasValidAutoLoginUrl ? "border-destructive" : ""} + placeholder={t( + "ui.dev.clients.general.auto_login.url_placeholder", + "https://app.example.com/login?auto=1", + )} + /> +

+ {t( + "msg.dev.clients.general.auto_login.help", + "이 URL은 RP가 state, nonce, PKCE 값을 직접 생성한 뒤 Baron OIDC로 리다이렉트해야 합니다.", + )} +

+ {!hasValidAutoLoginUrl ? ( +

+ {t( + "msg.dev.clients.general.auto_login.invalid_url", + "자동 로그인 URL 형식이 올바르지 않습니다. http 또는 https 주소를 입력하세요.", + )} +

+ ) : null} +
+
+
+ + {/* 6. Security Settings */}