<h2>JWT: Fundamentos e Implementação Prática</h2>
<p>JWT (JSON Web Token) é um padrão aberto (RFC 7519) para transmissão segura de informações entre partes. Diferente de sessões tradicionais, o JWT é stateless: o servidor não precisa armazenar dados sobre o token. Um JWT consiste em três partes separadas por pontos: header.payload.signature.</p>
<p>O header contém o tipo do token e o algoritmo de criptografia. O payload armazena as claims (dados) que você deseja transmitir. A signature garante que o token não foi alterado. Aqui está uma implementação prática usando a biblioteca <code>firebase/php-jwt</code>:</p>
<pre><code class="language-php"><?php
require 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$secretKey = 'sua_chave_secreta_super_segura';
// Gerar um JWT
$issuedAt = new DateTimeImmutable();
$expire = $issuedAt->modify('+1 hour')->getTimestamp();
$payload = [
'iat' => $issuedAt->getTimestamp(),
'exp' => $expire,
'iss' => 'sua_aplicacao',
'sub' => 'usuario_123',
'email' => 'usuario@example.com'
];
$token = JWT::encode($payload, $secretKey, 'HS256');
echo "Token: " . $token . "\n";
// Validar um JWT
try {
$decoded = JWT::decode($token, new Key($secretKey, 'HS256'));
echo "Usuário: " . $decoded->email . "\n";
} catch (Exception $e) {
echo "Token inválido: " . $e->getMessage();
}
?></code></pre>
<h3>Boas Práticas com JWT</h3>
<p>Sempre use algoritmos assimétricos (RS256) em produção em vez de HS256. Armazene a chave secreta em variáveis de ambiente, nunca no código. Implemente rotação de chaves para aumentar a segurança. Configure um tempo de expiração razoável (15 minutos para access tokens, dias para refresh tokens) e nunca armazene informações sensíveis no payload — ele é apenas codificado, não criptografado.</p>
<h2>OAuth 2.0: Autenticação Delegada</h2>
<p>OAuth 2.0 é um protocolo de autorização que permite aos usuários autenticar-se em sua aplicação usando contas de terceiros (Google, GitHub, Facebook). Diferente de JWT, que é um formato de token, OAuth 2.0 é um fluxo completo de autenticação com papéis bem definidos: Resource Owner (usuário), Client (sua app), Authorization Server (Google, GitHub) e Resource Server (API protegida).</p>
<p>O fluxo mais comum é o "Authorization Code Flow". O usuário é redirecionado para o provedor OAuth, que valida suas credenciais e retorna um código de autorização. Sua aplicação troca esse código por um access token. Aqui está um exemplo usando Google OAuth com a biblioteca <code>google/apiclient</code>:</p>
<pre><code class="language-php"><?php
require 'vendor/autoload.php';
$clientId = 'seu_client_id.apps.googleusercontent.com';
$clientSecret = 'sua_client_secret';
$redirectUri = 'https://sua-app.com/oauth-callback';
$client = new Google_Client();
$client->setClientId($clientId);
$client->setClientSecret($clientSecret);
$client->setRedirectUri($redirectUri);
$client->addScope('email');
$client->addScope('profile');
// 1. Gerar URL de autenticação
if (!isset($_GET['code'])) {
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
exit;
}
// 2. Troca do código por token
if (isset($_GET['code'])) {
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
if (!isset($token['error'])) {
$client->setAccessToken($token);
$oauth2 = new Google_Service_Oauth2($client);
$userInfo = $oauth2->userinfo->get();
$_SESSION['user_email'] = $userInfo->email;
$_SESSION['user_name'] = $userInfo->name;
header('Location: /dashboard');
exit;
}
}
?></code></pre>
<h2>Combinando JWT e OAuth 2.0 em APIs</h2>
<p>A abordagem ideal é usar OAuth 2.0 para autenticação (permitir login) e JWT para autorização (validar requisições subsequentes). Após o usuário fazer login via OAuth, você emite um JWT que ele usa nas requisições à API. Isso combina a segurança do OAuth com a eficiência do JWT.</p>
<p>Aqui está um exemplo prático de um middleware que valida JWTs em requisições:</p>
<pre><code class="language-php"><?php
require 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class JWTMiddleware {
private $secretKey = 'sua_chave_secreta';
public function validateToken($request) {
$authHeader = $request->getHeader('Authorization');
if (!$authHeader) {
return ['valid' => false, 'message' => 'Token não fornecido'];
}
// Formato: "Bearer token_aqui"
$parts = explode(' ', $authHeader[0] ?? '');
if (count($parts) !== 2 || $parts[0] !== 'Bearer') {
return ['valid' => false, 'message' => 'Formato inválido'];
}
try {
$decoded = JWT::decode($parts[1], new Key($this->secretKey, 'HS256'));
return ['valid' => true, 'user' => $decoded];
} catch (Exception $e) {
return ['valid' => false, 'message' => 'Token expirado ou inválido'];
}
}
}
// Uso em um endpoint
$middleware = new JWTMiddleware();
$validation = $middleware->validateToken($_SERVER);
if (!$validation['valid']) {
http_response_code(401);
echo json_encode(['error' => $validation['message']]);
exit;
}
// Token válido, prosseguir
$userId = $validation['user']->sub;
?></code></pre>
<h3>Refresh Tokens</h3>
<p>Nunca mantenha access tokens com expiração muito longa. Use refresh tokens, armazenados com segurança (httpOnly cookies), para renovar access tokens expirados. O servidor deve validar o refresh token antes de emitir um novo access token, rejeitando tokens revogados.</p>
<h2>Conclusão</h2>
<p>JWT é excelente para APIs stateless e aplicações modernas, oferecendo eficiência e escalabilidade. OAuth 2.0 é o padrão para autenticação segura com provedores terceirizados, eliminando a necessidade de armazenar senhas. Combinando ambos, você cria um sistema robusto: OAuth 2.0 autentica o usuário inicialmente, JWT autentica requisições subsequentes. Sempre implemente expiração de tokens, use HTTPS, valide rigorosamente no backend e mantenha secrets fora do controle de versão.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://tools.ietf.org/html/rfc7519" target="_blank" rel="noopener noreferrer">RFC 7519 - JWT Official Specification</a></li>
<li><a href="https://tools.ietf.org/html/rfc6749" target="_blank" rel="noopener noreferrer">OAuth 2.0 Authorization Framework - RFC 6749</a></li>
<li><a href="https://github.com/firebase/php-jwt" target="_blank" rel="noopener noreferrer">Firebase JWT Library for PHP</a></li>
<li><a href="https://developers.google.com/identity/protocols/oauth2/web-server" target="_blank" rel="noopener noreferrer">Google OAuth 2.0 PHP Client Documentation</a></li>
<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html" target="_blank" rel="noopener noreferrer">OWASP Authentication Cheat Sheet</a></li>
</ul>