Makrosites

Suas ideias em realidade digital!

JWT em PHP: autenticação segura para APIs (exemplo completo)

JWT em PHP: autenticação segura para APIs (exemplo completo)

O que é JWT e por que usar em APIs PHP?

JWT (JSON Web Token) é um padrão aberto para autenticação stateless, muito usado em APIs REST. Em vez de sessão no servidor, o usuário recebe um token assinado, que é enviado a cada requisição.

JWT é ideal para:

---

Fluxo de autenticação com JWT

  1. Usuário faz login (email/senha)
  2. API valida credenciais
  3. API gera um JWT assinado
  4. Front armazena o token
  5. Requisições enviam Authorization: Bearer TOKEN
---

Estrutura básica do JWT

HEADER.PAYLOAD.SIGNATURE
---

Implementação JWT em PHP puro (sem biblioteca)

Para fins didáticos, vamos implementar JWT manualmente. Em produção, use bibliotecas como firebase/php-jwt.

---

1) Funções auxiliares JWT

---

2) Gerar token JWT

 'HS256', 'typ' => 'JWT'];

  $payload['iat'] = time();
  $payload['exp'] = time() + $expSeconds;

  $base64Header  = base64UrlEncode(json_encode($header));
  $base64Payload = base64UrlEncode(json_encode($payload));

  $signature = hash_hmac(
    'sha256',
    "$base64Header.$base64Payload",
    $secret,
    true
  );

  $base64Signature = base64UrlEncode($signature);

  return "$base64Header.$base64Payload.$base64Signature";
}
---

3) Validar token JWT

---

Exemplo de login que gera JWT

 'Credenciais inválidas']);
  exit;
}

$token = generateJWT([
  'id' => 1,
  'email' => $data['email'],
  'role' => 'admin'
], 'SEGREDO_SUPER_SECRETO');

echo json_encode(['token' => $token]);
---

Protegendo rotas com JWT

---

JWT + CORS (atenção)

Sempre libere o header Authorization:

header("Access-Control-Allow-Headers: Content-Type, Authorization");
---

Boas práticas de segurança com JWT

  • Use HTTPS sempre
  • Tokens curtos (1h)
  • Não salve JWT em localStorage se puder evitar
  • Use refresh token se necessário
  • Nunca exponha o segredo
---

Erros comuns com JWT em PHP

  • Usar segredo fraco
  • Não validar expiração
  • Não validar assinatura
  • Retornar 403 em vez de 401
---