fix and update

This commit is contained in:
lendry
2026-06-29 17:28:52 +03:00
parent e3c418d921
commit 2701c0e90b
2 changed files with 107 additions and 13 deletions

View File

@@ -2,21 +2,42 @@ const API_ORIGIN_PROXY_PREFIX = '/idp-api';
const configuredApiUrl = (process.env.NEXT_PUBLIC_API_URL ?? 'http://localhost:3000').replace(/\/$/, '');
const configuredWsUrl = (process.env.NEXT_PUBLIC_WS_URL ?? 'ws://localhost:8085/ws').replace(/\/$/, '');
function getServerApiUrl(): string {
return (process.env.INTERNAL_API_URL ?? configuredApiUrl).replace(/\/$/, '');
}
/** Same-origin /idp-api только если PUBLIC API URL явно задан как прокси-путь на фронтенде. */
function usesSameOriginApiProxy(): boolean {
if (configuredApiUrl.startsWith('/')) {
return true;
}
return /\/idp-api\/?$/i.test(configuredApiUrl) || configuredApiUrl.includes('/idp-api/');
}
function usesSameOriginWsProxy(): boolean {
if (configuredWsUrl.startsWith('/')) {
return true;
}
return configuredWsUrl.includes('/idp-api/');
}
function resolveBrowserApiBaseUrl(): string {
// На сервере (SSR) обращаемся к API напрямую по настроенному URL.
// SSR: внутренний URL Docker-сети (api-gateway), не публичный домен.
if (typeof window === 'undefined') {
return configuredApiUrl;
return getServerApiUrl();
}
// Если URL уже относительный — используем как есть.
if (configuredApiUrl.startsWith('/')) {
return configuredApiUrl.replace(/\/+$/, '') || API_ORIGIN_PROXY_PREFIX;
}
// В браузере ВСЕГДА ходим через same-origin прокси /idp-api (Next.js rewrites
// проксируют на внутренний api-gateway). Это исключает CORS и работу через
// отдельный домен API (например api.idpmvk.lpr) для запросов самого UI IdP.
return API_ORIGIN_PROXY_PREFIX;
// Split-domain (https://api.example.com): браузер ходит напрямую на API-домен.
// Same-origin (https://sso.example.com/idp-api): через /idp-api и host/nginx rewrites.
if (usesSameOriginApiProxy()) {
return API_ORIGIN_PROXY_PREFIX;
}
return configuredApiUrl;
}
function resolveBrowserWsBaseUrl(): string {
@@ -24,8 +45,12 @@ function resolveBrowserWsBaseUrl(): string {
return configuredWsUrl;
}
const scheme = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
return `${scheme}//${window.location.host}${API_ORIGIN_PROXY_PREFIX}/ws`;
if (usesSameOriginWsProxy()) {
const scheme = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
return `${scheme}//${window.location.host}${API_ORIGIN_PROXY_PREFIX}/ws`;
}
return configuredWsUrl;
}
export function getApiUrl(): string {
@@ -36,7 +61,7 @@ export function getWsUrl(): string {
return resolveBrowserWsBaseUrl();
}
/** @deprecated Используйте getApiUrl() — URL может переключаться на same-origin /idp-api в браузере */
/** @deprecated Используйте getApiUrl() — в браузере URL зависит от режима (split-domain или /idp-api) */
export const API_URL = configuredApiUrl;
export interface PublicUser {