Tokens Bearer e JWT: entenda a autenticação sem estado

Programação

Tokens Bearer e JWT: entenda a autenticação sem estado

Conforme as aplicações foram deixando de ser só páginas web e passaram a incluir apps mobile, integrações e microsserviços, um novo problema apareceu: como autenticar sem depender de sessão guardada no servidor? A resposta mais popular hoje é o token Bearer, especialmente na forma de JWT.

Um token Bearer funciona de um jeito bem direto: quem apresenta o token é considerado autenticado. Ele é enviado em todas as requisições dentro do cabeçalho Authorization, assim: Authorization: Bearer <token>.

O JWT (JSON Web Token) é o formato mais usado de token Bearer hoje. Ele é dividido em três partes separadas por ponto, cada uma codificada em Base64: um cabeçalho, um conjunto de informações (chamadas de claims, como o ID do usuário e a data de expiração) e uma assinatura que garante que ninguém alterou o conteúdo pelo caminho.

Um exemplo de geração e validação de JWT em PHP, usando a biblioteca firebase/php-jwt:

<?php
use FirebaseJWTJWT;
use FirebaseJWTKey;

function gerarJwt(int $usuarioId, string $chaveSecreta): string {
    $payload = [
        'sub' => $usuarioId,
        'iat' => time(),
        'exp' => time() + 900, // expira em 15 minutos
    ];
    return JWT::encode($payload, $chaveSecreta, 'HS256');
}

function validarJwt(string $token, string $chaveSecreta): ?array {
    try {
        $decodificado = JWT::decode($token, new Key($chaveSecreta, 'HS256'));
        return (array) $decodificado;
    } catch (Exception $e) {
        return null;
    }
}

A grande vantagem do JWT é não depender de nenhum estado guardado no servidor: qualquer serviço que conheça a chave secreta consegue validar o token sozinho, o que facilita muito arquiteturas com vários microsserviços.

Por outro lado, um JWT não pode ser "desligado" facilmente antes da hora marcada para expirar, por isso o tempo de vida costuma ser curto (minutos). Outro cuidado importante: o conteúdo do payload é apenas codificado, não criptografado, então nunca é uma boa ideia colocar dados sensíveis dentro dele.

Fonte
Equipe Suadica

Veja também

Mais Dicas