riseup-squad20/susconecta/lib/env-config.ts

88 lines
2.4 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 extractProjectReference(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 extractProjectReferenceFromKey(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 urlReference = extractProjectReference(SUPABASE_URL);
const keyReference = extractProjectReferenceFromKey(SUPABASE_ANON_KEY);
if (!urlReference || !keyReference) {
console.warn("[ENV] Não foi possível extrair REF do projeto");
return false;
}
if (urlReference !== keyReference) {
console.error("[ENV] ERRO: URL e API Key são de projetos diferentes!", {
urlRef: urlReference,
keyRef: keyReference,
});
return false;
}
console.log("[ENV] Projeto validado:", urlReference);
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: extractProjectReference(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;