fix and update
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user