Introdução ao OAuth 2.0 e autorização JWT em C++
No mundo moderno do desenvolvimento web, a segurança e a conveniência da autenticação desempenham um papel fundamental. OAuth 2.0 e JWT (JSON Web Tokens) tornaram-se os padrões de facto para implementar autorização em sistemas distribuídos. Neste artigo, veremos como implementar autorização OAuth 2.0 e JWT na linguagem C++ — uma linguagem poderosa e de alto desempenho, frequentemente usada para criar aplicações servidoras de alta carga.
Apesar de C++ não ser uma escolha típica para desenvolvimento web, seu desempenho e controle sobre a memória o tornam ideal para criar API gateways, microsserviços e sistemas em tempo real. Mostraremos como usar bibliotecas modernas de C++ para trabalhar com HTTP, JSON e criptografia, a fim de construir um sistema de autorização confiável.
Fundamentos do OAuth 2.0
OAuth 2.0 é um protocolo de autorização que permite que aplicações obtenham acesso limitado aos recursos do usuário sem transmitir suas credenciais. Os papéis principais no OAuth 2.0 são:
- Resource Owner — o usuário proprietário dos recursos
- Client — a aplicação que solicita acesso
- Authorization Server — o servidor que emite tokens
- Resource Server — o servidor que fornece recursos protegidos
Os principais fluxos (grant types) do OAuth 2.0 são:
- Authorization Code — para aplicações servidoras
- Client Credentials — para autenticação serviço-a-serviço
- Implicit — obsoleto, para SPAs
- Resource Owner Password Credentials — para clientes confiáveis
Implementação de um cliente OAuth 2.0 em C++
Para trabalhar com HTTP em C++, usaremos a biblioteca cpp-httplib. Vejamos um exemplo de obtenção de access token através do fluxo Client Credentials:
#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>
using json = nlohmann::json;
std::string get_access_token(const std::string& client_id, const std::string& client_secret, const std::string& token_url) { httplib::Client cli(token_url); // Formando o corpo da requisição std::string body = "grant_type=client_credentials&" "client_id=" + client_id + "&" "client_secret=" + client_secret; auto res = cli.Post("/token", body, "application/x-www-form-urlencoded"); if (res && res->status == 200) { json response = json::parse(res->body); return response["access_token"]; } throw std::runtime_error("Failed to get access token");}JWT (JSON Web Tokens)
JWT é uma forma compacta e autossuficiente de transmitir informações entre partes na forma de um objeto JSON. O token consiste em três partes:
- Header — contém o tipo do token e o algoritmo de assinatura
- Payload — contém as claims (declarações) sobre o usuário
- Signature — assinatura para verificação
Geração de JWT em C++
Para trabalhar com JWT e criptografia em C++, usamos as bibliotecas jwt-cpp e OpenSSL. Exemplo de geração de JWT com o algoritmo HS256:
#include <jwt-cpp/jwt.h>#include <chrono>
std::string create_jwt(const std::string& user_id, const std::string& secret_key) { auto now = std::chrono::system_clock::now(); auto exp = now + std::chrono::hours(1); auto token = jwt::create() .set_type("JWT") .set_issuer("auth.example.com") .set_subject(user_id) .set_issued_at(now) .set_expires_at(exp) .set_payload_c