Apex T.I.C

Endpoint: Autenticação

O que é Autenticação?

Autenticação é o processo que verifica a identidade de um usuário, sistema ou dispositivo, garantindo que a entidade que está solicitando acesso seja realmente quem afirma ser. Em sistemas e APIs, a autenticação é fundamental para a segurança, evitando acessos não autorizados e protegendo recursos sensíveis.

Diferenciação importante: Autenticação não é autorização. A autenticação responde “Quem é você?”, enquanto a autorização responde “O que você pode fazer?”. Ambos são passos críticos em segurança.

Principais Métodos de Autenticação

Funcionamento do Endpoint de Autenticação

Um endpoint típico de autenticação espera receber credenciais do usuário (ex: usuário e senha) e, após validação, retorna um token para autenticação nas próximas requisições. O fluxo básico:

  1. Cliente envia requisição POST com credenciais para o endpoint de login.
  2. Servidor valida as credenciais e, se corretas, gera e retorna um token (ex: JWT) com informações codificadas e validade.
  3. Cliente armazena o token (ex: localStorage, sessionStorage, cookies seguros) e o envia no header Authorization das próximas requisições.
  4. Servidor valida o token em cada requisição, permitindo ou negando acesso conforme as regras.
POST /api/login
Content-Type: application/json

{
  "username": "usuario123",
  "password": "senhaSegura!"
}

Resposta de sucesso:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

JSON Web Tokens (JWT) em Detalhes

JWT é um padrão aberto para criar tokens seguros que transmitem informações verificáveis. É composto por três partes separadas por ponto:

Exemplo de token JWT (simplificado):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJ1c2VySWQiOiIxMjM0NSIsIm5hbWUiOiJKb2huIERvZSIsImV4cCI6MTY2MDAwMDAwMH0
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

O servidor pode validar rapidamente o token sem precisar consultar o banco, garantindo alta performance.

Armazenamento Seguro de Tokens

Como o token é o “passe” do usuário, o armazenamento no cliente deve ser feito com cuidado para evitar vulnerabilidades:

Recomendação: combine armazenamento seguro com proteção contra Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF).

Fluxo Completo com Refresh Tokens

Para garantir que o usuário não precise fazer login constantemente, utiliza-se o conceito de refresh token:

  1. Ao autenticar, servidor emite access token (curta duração) e refresh token (mais longo).
  2. Access token é usado para autenticação em chamadas API.
  3. Quando o access token expira, o cliente usa o refresh token para solicitar um novo access token sem precisar do usuário informar credenciais novamente.
  4. Refresh tokens devem ser armazenados com ainda mais cuidado e podem ser revogados para maior segurança.

Boas Práticas para Endpoints de Autenticação

Desafios e Considerações

Exemplo Prático de Backend: Autenticação com Node.js e JWT

Este exemplo mostra um servidor Express que autentica um usuário, gera um token JWT e retorna para o cliente:

// Dependências
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

// Chave secreta para assinatura do token (em produção, use variáveis de ambiente)
const SECRET_KEY = 'sua_chave_secreta_super_segura';

// Usuário fictício para exemplo
const usuarioExemplo = {
  username: 'usuario123',
  password: 'senhaSegura' // Nunca armazene senhas em texto plano na vida real!
};

// Endpoint de login
app.post('/api/login', (req, res) => {
  const { username, password } = req.body;
  
  // Validação simples
  if (username === usuarioExemplo.username && password === usuarioExemplo.password) {
    // Dados para o payload do token
    const payload = {
      username: usuarioExemplo.username,
      role: 'user'
    };
    
    // Gerar token JWT válido por 1 hora
    const token = jwt.sign(payload, SECRET_KEY, { expiresIn: '1h' });
    
    return res.json({ token });
  }
  
  // Falha na autenticação
  return res.status(401).json({ message: 'Credenciais inválidas' });
});

// Middleware para proteger rotas usando o token JWT
function autenticarToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  
  if (!token) return res.sendStatus(401);
  
  jwt.verify(token, SECRET_KEY, (err, user) => {
    if (err) return res.sendStatus(403); // Token inválido ou expirado
    req.user = user;
    next();
  });
}

// Rota protegida exemplo
app.get('/api/dados', autenticarToken, (req, res) => {
  res.json({ message: `Bem-vindo ${req.user.username}! Este é um dado protegido.` });
});

// Iniciar servidor
app.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});

Este código é um exemplo básico, mas mostra os passos essenciais para implementar autenticação com JWT no backend.