import { useState, useEffect, useCallback } from "react"; interface TokenInfo { key: string; present: boolean; value?: string; preview?: string; decoded?: { valid: boolean; expired?: boolean; exp?: number; sub?: string; email?: string; role?: string; }; } export default function AdminDiagnostico() { const [tokens, setTokens] = useState([]); const [log, setLog] = useState([]); const addLog = useCallback((msg: string) => { setLog((prev) => [...prev, `[${new Date().toLocaleTimeString()}] ${msg}`]); }, []); const decodeJwt = (token: string) => { try { const parts = token.split("."); if (parts.length !== 3) return { valid: false }; const payload = JSON.parse(atob(parts[1])); const now = Math.floor(Date.now() / 1000); const expired = payload.exp ? payload.exp < now : false; return { valid: true, expired, exp: payload.exp, sub: payload.sub, email: payload.email, role: payload.role, }; } catch { return { valid: false }; } }; const scanTokens = useCallback(() => { const keys = [ "authToken", "token", "refreshToken", "authUser", "appSession", ]; const results: TokenInfo[] = keys.map((key) => { const value = localStorage.getItem(key); if (!value) return { key, present: false }; const info: TokenInfo = { key, present: true, value, preview: value.length > 100 ? value.substring(0, 100) + "..." : value, }; if (key === "authToken" || key === "token") { info.decoded = decodeJwt(value); } return info; }); setTokens(results); addLog("Tokens escaneados"); }, [addLog]); const clearExpiredTokens = () => { let cleared = 0; tokens.forEach((t) => { if (t.decoded?.expired) { localStorage.removeItem(t.key); cleared++; addLog(`❌ Removido: ${t.key} (expirado)`); } }); if (cleared === 0) { addLog("✅ Nenhum token expirado encontrado"); } else { addLog(`✅ ${cleared} token(s) expirado(s) removido(s)`); } scanTokens(); }; const clearAllTokens = () => { const keys = [ "authToken", "token", "refreshToken", "authUser", "appSession", ]; keys.forEach((k) => localStorage.removeItem(k)); addLog("🗑️ TODOS os tokens removidos"); scanTokens(); }; const testLogin = async () => { addLog("🔐 Testando login..."); try { const response = await fetch( "https://yuanqfswhberkoevtmfr.supabase.co/auth/v1/token?grant_type=password", { method: "POST", headers: { "Content-Type": "application/json", apikey: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ", }, body: JSON.stringify({ email: "riseup@popcode.com.br", password: "riseup", }), } ); if (response.ok) { const data = await response.json(); localStorage.setItem("authToken", data.access_token); localStorage.setItem("refreshToken", data.refresh_token); localStorage.setItem("authUser", JSON.stringify(data.user)); addLog( `✅ Login OK! Token salvo. exp=${decodeJwt(data.access_token).exp}` ); scanTokens(); } else { const text = await response.text(); addLog(`❌ Login falhou: ${response.status} ${text}`); } } catch (error) { addLog(`❌ Erro: ${error}`); } }; useEffect(() => { scanTokens(); addLog("Página de diagnóstico carregada"); }, [scanTokens, addLog]); return (

🔧 Admin - Diagnóstico de Autenticação

{/* Ações */}

Ações

{/* Tokens */}

Tokens no localStorage

{tokens.length === 0 && (

Nenhum token encontrado

)} {tokens.map((t) => (

{t.key}

{!t.present ? "AUSENTE" : t.decoded?.expired ? "EXPIRADO" : t.decoded?.valid ? "VÁLIDO" : "PRESENTE"}
{t.present && ( <>

{t.preview}

{t.decoded && (

Válido:{" "} {t.decoded.valid ? "✅" : "❌"}

{t.decoded.expired !== undefined && (

Expirado:{" "} {t.decoded.expired ? "⚠️ SIM" : "✅ NÃO"}

)} {t.decoded.exp && (

Expira em:{" "} {new Date(t.decoded.exp * 1000).toLocaleString()}

)} {t.decoded.email && (

Email:{" "} {t.decoded.email}

)} {t.decoded.role && (

Role:{" "} {t.decoded.role}

)}
)} )}
))}
{/* Log */}

📋 Log

{log.length === 0 && (

Nenhuma ação ainda

)} {log.map((line, i) => (
{line}
))}
{/* Informações */}

ℹ️ Informações

  • • Esta página ajuda a diagnosticar problemas de autenticação
  • • Tokens expirados causam erro 401 "No API key found in request"
  • • Use "Limpar Expirados" para remover tokens inválidos
  • • Use "Testar Login Admin" para obter token válido (riseup@popcode.com.br)
  • • Após limpar/login, recarregue a página para aplicar mudanças
); }