Tokens JWT em C++: biblioteca jwt-cpp
\n\nJSON 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\nNeste 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\nInstalação do jwt-cpp
\n\nA 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\ngit clone https://github.com/Thalhammer/jwt-cpp.git\n\nEm seguida, adicione o caminho para a pasta include nas configurações do seu compilador. Se você estiver usando CMake, a conexão será assim:
add_subdirectory(jwt-cpp)\ntarget_link_libraries(your_project jwt-cpp)\n\nA biblioteca depende de OpenSSL e jsoncpp (ou nlohmann/json), portanto, certifique-se de que eles estejam instalados.
Criação básica de um token JWT
\n\nO 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\nO resultado será uma string composta por três partes (header, payload, signature), separadas por pontos.
\n\nVerificação do token
\n\nPara 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\nImportante: se o token estiver expirado (exp), modificado ou assinado com outra chave, uma exceção será lançada.
\n\nTrabalhando com RSA (criptografia assimétrica)
\n\nPara 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" Também na biblioteca
Testes em Swift (iOS/macOS): frameworks e ferramentas
Geração Swagger/OpenAPI para Swift: ferramentas e bibliotecas
Trabalho com XML em Kotlin: bibliotecas, parsing e criação de documentos
ORM para Java: comparação entre Hibernate, MyBatis, JPA e Spring Data