PHP

Como Usar Autenticação JWT e OAuth 2.0 em APIs PHP em Produção

7 min de leitura

Como Usar Autenticação JWT e OAuth 2.0 em APIs PHP em Produção

JWT: Fundamentos e Implementação Prática 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. 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 : Boas Práticas com JWT 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. OAuth 2.0: Autenticação Delegada OAuth 2.0 é um

<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">&lt;?php

require &#039;vendor/autoload.php&#039;;

use Firebase\JWT\JWT;

use Firebase\JWT\Key;

$secretKey = &#039;sua_chave_secreta_super_segura&#039;;

// Gerar um JWT

$issuedAt = new DateTimeImmutable();

$expire = $issuedAt-&gt;modify(&#039;+1 hour&#039;)-&gt;getTimestamp();

$payload = [

&#039;iat&#039; =&gt; $issuedAt-&gt;getTimestamp(),

&#039;exp&#039; =&gt; $expire,

&#039;iss&#039; =&gt; &#039;sua_aplicacao&#039;,

&#039;sub&#039; =&gt; &#039;usuario_123&#039;,

&#039;email&#039; =&gt; &#039;usuario@example.com&#039;

];

$token = JWT::encode($payload, $secretKey, &#039;HS256&#039;);

echo &quot;Token: &quot; . $token . &quot;\n&quot;;

// Validar um JWT

try {

$decoded = JWT::decode($token, new Key($secretKey, &#039;HS256&#039;));

echo &quot;Usuário: &quot; . $decoded-&gt;email . &quot;\n&quot;;

} catch (Exception $e) {

echo &quot;Token inválido: &quot; . $e-&gt;getMessage();

}

?&gt;</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 &quot;Authorization Code Flow&quot;. 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">&lt;?php

require &#039;vendor/autoload.php&#039;;

$clientId = &#039;seu_client_id.apps.googleusercontent.com&#039;;

$clientSecret = &#039;sua_client_secret&#039;;

$redirectUri = &#039;https://sua-app.com/oauth-callback&#039;;

$client = new Google_Client();

$client-&gt;setClientId($clientId);

$client-&gt;setClientSecret($clientSecret);

$client-&gt;setRedirectUri($redirectUri);

$client-&gt;addScope(&#039;email&#039;);

$client-&gt;addScope(&#039;profile&#039;);

// 1. Gerar URL de autenticação

if (!isset($_GET[&#039;code&#039;])) {

$authUrl = $client-&gt;createAuthUrl();

header(&#039;Location: &#039; . filter_var($authUrl, FILTER_SANITIZE_URL));

exit;

}

// 2. Troca do código por token

if (isset($_GET[&#039;code&#039;])) {

$token = $client-&gt;fetchAccessTokenWithAuthCode($_GET[&#039;code&#039;]);

if (!isset($token[&#039;error&#039;])) {

$client-&gt;setAccessToken($token);

$oauth2 = new Google_Service_Oauth2($client);

$userInfo = $oauth2-&gt;userinfo-&gt;get();

$_SESSION[&#039;user_email&#039;] = $userInfo-&gt;email;

$_SESSION[&#039;user_name&#039;] = $userInfo-&gt;name;

header(&#039;Location: /dashboard&#039;);

exit;

}

}

?&gt;</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">&lt;?php

require &#039;vendor/autoload.php&#039;;

use Firebase\JWT\JWT;

use Firebase\JWT\Key;

class JWTMiddleware {

private $secretKey = &#039;sua_chave_secreta&#039;;

public function validateToken($request) {

$authHeader = $request-&gt;getHeader(&#039;Authorization&#039;);

if (!$authHeader) {

return [&#039;valid&#039; =&gt; false, &#039;message&#039; =&gt; &#039;Token não fornecido&#039;];

}

// Formato: &quot;Bearer token_aqui&quot;

$parts = explode(&#039; &#039;, $authHeader[0] ?? &#039;&#039;);

if (count($parts) !== 2 || $parts[0] !== &#039;Bearer&#039;) {

return [&#039;valid&#039; =&gt; false, &#039;message&#039; =&gt; &#039;Formato inválido&#039;];

}

try {

$decoded = JWT::decode($parts[1], new Key($this-&gt;secretKey, &#039;HS256&#039;));

return [&#039;valid&#039; =&gt; true, &#039;user&#039; =&gt; $decoded];

} catch (Exception $e) {

return [&#039;valid&#039; =&gt; false, &#039;message&#039; =&gt; &#039;Token expirado ou inválido&#039;];

}

}

}

// Uso em um endpoint

$middleware = new JWTMiddleware();

$validation = $middleware-&gt;validateToken($_SERVER);

if (!$validation[&#039;valid&#039;]) {

http_response_code(401);

echo json_encode([&#039;error&#039; =&gt; $validation[&#039;message&#039;]]);

exit;

}

// Token válido, prosseguir

$userId = $validation[&#039;user&#039;]-&gt;sub;

?&gt;</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>

Comentários

Mais em PHP

Laravel Testes com PHPUnit e Pest: Do Básico ao Avançado
Laravel Testes com PHPUnit e Pest: Do Básico ao Avançado

PHPUnit: Fundamentos e Configuração PHPUnit é o framework de testes mais cons...

Arrays em PHP: Indexados, Associativos e Multidimensionais: Do Básico ao Avançado
Arrays em PHP: Indexados, Associativos e Multidimensionais: Do Básico ao Avançado

Arrays Indexados Arrays indexados são a forma mais básica de estrutura de dad...

Guia Completo de Roteamento HTTP em PHP: Criando um Router Simples
Guia Completo de Roteamento HTTP em PHP: Criando um Router Simples

O que é Roteamento HTTP e Por Que Importa Roteamento HTTP é o mecanismo funda...