Chave da OpenAI (ou de qualquer API paga) no front-end: como descobrir e o que fazer
Chave de API no navegador é chave pública: alguém vai usar e você paga a conta. Como encontrar, por que o prefixo NEXT_PUBLIC_ e VITE_ entrega a chave, e como corrigir.
Todo o JavaScript do seu site é baixado por quem o visita. Se a chave da OpenAI, da Anthropic, do Stripe ou do Resend está ali, qualquer pessoa pode copiá-la e usar — gerando conta no seu cartão, enviando spam no seu nome ou esgotando o seu limite.
Sinais de que a chave está exposta
- Variáveis com prefixo público guardando chave secreta:
NEXT_PUBLIC_OPENAI_API_KEY,VITE_STRIPE_SECRET. O prefixo existe para mandar o valor ao navegador. dangerouslyAllowBrowser: trueno cliente da OpenAI — o nome já avisa.- A chamada para a API paga é feita de dentro de um componente da tela.
- No site publicado, F12 → Sources, busque por
sk-,sk_live_,re_ousecret.
Como corrigir
A chave vai para o servidor, numa variável SEM prefixo público, e o site chama uma rota sua. Essa rota confere o login e, de preferência, limita quantas vezes cada pessoa pode chamar.
// app/api/resumo/route.ts — a chave fica só no servidor
import OpenAI from "openai";
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); // sem NEXT_PUBLIC_
export async function POST(req: Request) {
const usuario = await usuarioLogado(req); // a sua conferência de sessão
if (!usuario) return Response.json({ erro: "faça login" }, { status: 401 });
const { texto } = await req.json();
const r = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: texto }],
});
return Response.json({ resumo: r.choices[0]?.message.content });
}E a chave que já vazou
- 1Revogue a chave no painel do provedor e gere outra. Mudar o código não invalida a antiga.
- 2Configure um limite de gasto mensal no provedor: é a rede de proteção para o próximo erro.
- 3Confira o uso dos últimos dias em busca de consumo que não é seu.
Chave publicável existe e pode ir para o site: a anon/sb_publishable_… do Supabase, a pk_… do Stripe, a do Google Maps restrita ao seu domínio. A regra é: se o nome ou a documentação diz "secret", ela nunca vai para o navegador.
Dicas curtas de segurança para quem cria com IA: siga @npx_vibedefender no Instagram.