Autenticação e JWT
1 min de leitura
fonte
"Quem é você?" é a pergunta que toda API precisa responder antes de devolver dados sensíveis. Autenticação é exatamente isso: provar que o request vem de quem diz ser.
O fluxo mais comum hoje usa JWT (JSON Web Token):
- Usuário envia
email+senhanumPOST /login. - Servidor confere no banco, e se bate, gera um token JWT assinado com um segredo.
- Cliente guarda o token (em geral no
localStoragedo app). - Em cada próxima requisição, o cliente envia o token no header
Authorization: Bearer <token>. - Servidor confere a assinatura e libera o acesso.
Implementação:
import jwt from "jsonwebtoken";
import bcrypt from "bcrypt";
const SEGREDO = process.env.JWT_SECRET; // nunca hardcode!
app.post("/login", async (req, res) => {
const { email, senha } = req.body;
const usuario = await prisma.usuario.findUnique({ where: { email } });
if (!usuario || !(await bcrypt.compare(senha, usuario.senhaHash))) {
return res.status(401).json({ erro: "Credenciais inválidas" });
}
const token = jwt.sign({ userId: usuario.id }, SEGREDO, {
expiresIn: "7d",
});
res.json({ token });
});
// Middleware que protege rotas
function autenticar(req, res, next) {
const header = req.headers.authorization;
const token = header?.startsWith("Bearer ") ? header.slice(7) : null;
if (!token) return res.status(401).json({ erro: "Sem token" });
try {
req.userId = jwt.verify(token, SEGREDO).userId;
next();
} catch {
res.status(401).json({ erro: "Token inválido" });
}
}
app.get("/me", autenticar, (req, res) => {
res.json({ userId: req.userId });
});
Três regras de ouro:
- Nunca guarde senha em texto puro. Sempre passe por
bcrypt.hashantes de salvar. - Nunca coloque o segredo JWT direto no código. Use variável de ambiente
(
process.env.JWT_SECRET). - JWT não é armazenamento de sessão. Se precisar invalidar um token antes da expiração, é mais complexo - vale considerar sessões ou refresh tokens.
Dica: compare
bcrypt(lento, seguro) comargon2(mais moderno). Pra começar,bcryptestá ótimo.
No próximo nó, vamos blindar a API contra entradas ruins e padronizar o formato dos erros.
// recursos
// avaliação da trilha
—
ainda sem avaliações