forked from RiseUP/riseup-squad20
83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
/**
|
|
* Configuração segura das variáveis de ambiente
|
|
* Valida se URL e API Key pertencem ao mesmo projeto Supabase
|
|
*/
|
|
|
|
const SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL || "https://yuanqfswhberkoevtmfr.supabase.co";
|
|
const SUPABASE_ANON_KEY = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ";
|
|
|
|
/**
|
|
* Extrai o REF do projeto da URL da Supabase
|
|
*/
|
|
function extractProjectRef(url: string): string | null {
|
|
const match = url.match(/https:\/\/([^.]+)\.supabase\.co/);
|
|
return match ? match[1] : null;
|
|
}
|
|
|
|
/**
|
|
* Extrai o REF do projeto da API Key JWT
|
|
*/
|
|
function extractProjectRefFromKey(apiKey: string): string | null {
|
|
try {
|
|
const payload = JSON.parse(atob(apiKey.split('.')[1]));
|
|
return payload.ref || null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Valida se URL e API Key pertencem ao mesmo projeto
|
|
*/
|
|
function validateProjectConsistency(): boolean {
|
|
const urlRef = extractProjectRef(SUPABASE_URL);
|
|
const keyRef = extractProjectRefFromKey(SUPABASE_ANON_KEY);
|
|
|
|
if (!urlRef || !keyRef) {
|
|
console.warn('[ENV] Não foi possível extrair REF do projeto');
|
|
return false;
|
|
}
|
|
|
|
if (urlRef !== keyRef) {
|
|
console.error('[ENV] ERRO: URL e API Key são de projetos diferentes!', {
|
|
urlRef,
|
|
keyRef
|
|
});
|
|
return false;
|
|
}
|
|
|
|
console.log('[ENV] Projeto validado:', urlRef);
|
|
return true;
|
|
}
|
|
|
|
// Validar na inicialização
|
|
if (typeof window === 'undefined') {
|
|
// Server-side
|
|
validateProjectConsistency();
|
|
} else {
|
|
// Client-side
|
|
setTimeout(() => validateProjectConsistency(), 100);
|
|
}
|
|
|
|
export const ENV_CONFIG = {
|
|
SUPABASE_URL,
|
|
SUPABASE_ANON_KEY,
|
|
PROJECT_REF: extractProjectRef(SUPABASE_URL),
|
|
|
|
// URLs dos endpoints de autenticação
|
|
AUTH_ENDPOINTS: {
|
|
LOGIN: `${SUPABASE_URL}/auth/v1/token?grant_type=password`,
|
|
LOGOUT: `${SUPABASE_URL}/auth/v1/logout`,
|
|
REFRESH: `${SUPABASE_URL}/auth/v1/token?grant_type=refresh_token`,
|
|
USER: `${SUPABASE_URL}/auth/v1/user`,
|
|
},
|
|
|
|
// Headers padrão
|
|
DEFAULT_HEADERS: {
|
|
"Content-Type": "application/json",
|
|
"apikey": SUPABASE_ANON_KEY,
|
|
},
|
|
|
|
// Validação
|
|
isValid: validateProjectConsistency(),
|
|
} as const; |