Tokens JWT em C++: implementação e verificação com jwt-cpp

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Tokens JWT em C++: biblioteca jwt-cpp

\n\n

JSON Web Token (JWT) é uma forma compacta e autossuficiente de transmitir informações entre partes na forma de um objeto JSON. Em C++, existem várias bibliotecas para trabalhar com JWT, mas uma das mais populares e convenientes é a jwt-cpp. Ela fornece uma API simples para criar, assinar e verificar tokens JWT usando vários algoritmos (HMAC, RSA, ECDSA).

\n\n

Neste artigo, exploraremos os principais recursos da biblioteca jwt-cpp, aprenderemos a criar e verificar tokens e analisaremos exemplos de código para tarefas típicas.

\n\n

Instalação do jwt-cpp

\n\n

A biblioteca jwt-cpp é header-only (somente cabeçalhos), o que simplifica sua integração em um projeto. Para instalar, basta clonar o repositório:

\n\n
git clone https://github.com/Thalhammer/jwt-cpp.git
\n\n

Em seguida, adicione o caminho para a pasta include nas configurações do seu compilador. Se você estiver usando CMake, a conexão será assim:

\n\n
add_subdirectory(jwt-cpp)\ntarget_link_libraries(your_project jwt-cpp)
\n\n

A biblioteca depende de OpenSSL e jsoncpp (ou nlohmann/json), portanto, certifique-se de que eles estejam instalados.

\n\n

Criação básica de um token JWT

\n\n

O exemplo mais simples é criar um token usando o algoritmo HMAC-SHA256. Você pode adicionar campos padrão (iss, sub, exp, iat) e claims personalizados ao token.

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    // Criando o token\n    auto token = jwt::create()\n        .set_issuer("auth0")\n        .set_subject("1234567890")\n        .set_issued_at(std::chrono::system_clock::now())\n        .set_expires_at(std::chrono::system_clock::now() + std::chrono::hours{1})\n        .set_payload_claim("name", jwt::claim(std::string("John Doe")))\n        .sign(jwt::algorithm::hs256{"secret-key"});\n\n    std::cout << "Token: " << token << std::endl;\n    return 0;\n}
\n\n

O resultado será uma string composta por três partes (header, payload, signature), separadas por pontos.

\n\n

Verificação do token

\n\n

Para verificar a autenticidade do token, você deve usar a mesma chave secreta (ou chave pública para RSA). Exemplo de verificação:

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // seu token\n\n    try {\n        auto decoded = jwt::decode(token);\n        \n        // Verificando a assinatura\n        auto verifier = jwt::verify()\n            .allow_algorithm(jwt::algorithm::hs256{"secret-key"})\n            .with_issuer("auth0");\n\n        verifier.verify(decoded);\n\n        // Extraindo dados\n        std::cout << "Token válido!" << std::endl;\n        std::cout << "Subject: " << decoded.get_subject() << std::endl;\n        std::cout << "Name: " << decoded.get_payload_claim("name").as_string() << std::endl;\n    } catch (const std::exception& e) {\n        std::cerr << "Erro de verificação: " << e.what() << std::endl;\n    }\n\n    return 0;\n}
\n\n

Importante: se o token estiver expirado (exp), modificado ou assinado com outra chave, uma exceção será lançada.

\n\n

Trabalhando com RSA (criptografia assimétrica)

\n\n

Para sistemas mais seguros, o RSA é frequentemente usado. Nesse caso, o token é assinado com uma chave privada e verificado com uma chave pública.

\n\n
#include <jwt-cpp/jwt.h>\n#include <fstream>\n#include <sstream>\n\nint main() {\n    // Lendo a chave privada de um arquivo\n    std::ifstream priv_file("private.pem");\n    std::stringstream priv_ss;\n    priv_ss << priv_file.rdbuf();\n    std::string private_key = priv_ss.str();\n\n    // Criando o token com RSA\n    auto token = jwt::create()\n        .set_issuer("myapp")\n        .set_subject("user123"                    

Recommendations