Introdução ao OAuth 2.0 e JWT em C++
\n\nAplicações web e APIs modernas raramente dispensam sistemas de autorização. Os dois padrões mais populares — OAuth 2.0 e JWT (JSON Web Token) — tornaram-se a base da segurança para milhões de serviços. Neste artigo, vamos analisar como implementar a autorização básica OAuth 2.0 com tokens JWT na linguagem C++. Você aprenderá como esses protocolos funcionam e verá exemplos de código prontos que podem ser adaptados ao seu projeto.
\n\nO artigo é voltado para desenvolvedores iniciantes que já conhecem os fundamentos de C++ (classes, funções, trabalho com rede) e desejam adicionar autorização segura às suas aplicações. Não usaremos bibliotecas de terceiros para o servidor HTTP — todos os exemplos serão em C++ puro com dependências mínimas.
\n\nO que é OAuth 2.0 e para que serve?
\n\nOAuth 2.0 é um protocolo de autorização que permite que aplicativos obtenham acesso limitado aos recursos do usuário sem transmitir sua senha. Imagine que você queira dar a um aplicativo acesso às suas fotos no servidor. Em vez de inserir login e senha, você passa por um Authorization Server, que emite um token temporário. O aplicativo usa esse token para acessar os recursos.
\n\nPrincipais papéis no OAuth 2.0:
\n- \n
- Resource Owner — o usuário, proprietário dos dados. \n
- Client — o aplicativo que solicita acesso. \n
- Authorization Server — o servidor que emite tokens após a autenticação. \n
- Resource Server — o servidor que armazena dados protegidos (por exemplo, uma API). \n
Em C++, implementaremos uma versão simplificada do Authorization Server e do Resource Server, usando JWT como token de acesso.
\n\nJWT: estrutura e princípio de funcionamento
\n\nJWT (JSON Web Token) é uma forma compacta e autossuficiente de transmitir informações entre partes na forma de um objeto JSON. O token consiste em três partes separadas por pontos:
\n\nheader.payload.signature\n\nO Header contém o tipo do token e o algoritmo de assinatura (geralmente HMAC SHA256 ou RSA). O Payload é a carga útil: identificador do usuário, tempo de vida do token, papéis, etc. A Signature é a assinatura que verifica a integridade dos dados.
\n\nExemplo de criação de JWT em C++ sem bibliotecas (simplificado):
\n\n#include <iostream>\n#include <sstream>\n#include <vector>\n#include <openssl/sha.h>\n#include <openssl/hmac.h>\n\nstd::string base64_encode(const std::string &input) {\n // Implementação simplificada de Base64 (para exemplo)\n static const char* lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\n std::string result;\n // ... código de codificação ...\n return result;\n}\n\nstd::string create_jwt(const std::string &payload, const std::string &secret) {\n std::string header = R"({"alg":"HS256","typ":"JWT"})";\n std::string header_b64 = base64_encode(header);\n std::string payload_b64 = base64_encode(payload);\n std::string data = header_b64 + "." + payload_b64;\n \n unsigned char* sig = HMAC(EVP_sha256(), secret.c_str(), secret.length(), \n (unsigned char*)data.c_str(), data.length(), NULL, NULL);\n std::string sig_b64 = base64_encode(std::string((char*)sig, 32));\n \n return data + "." + sig_b64;\n}\n\nint main() {\n std::string payload = R"({"user_id":123,"role":"admin","exp":1700000000})";\n std::string token = create_jwt(payload, "my_secret_key");\n std::cout << "JWT: " << token << std::endl;\n return 0;\n}\n\nEste código cria um JWT com cabeçalho HS256 e carga útil. Em projetos reais, use bibliotecas testadas, como jwt-cpp ou libjwt, mas para entender o conceito, essa abordagem é suficiente.