Introdução ao OAuth 2.0 e JWT em C++
No desenvolvimento web moderno, segurança e controle de acesso são aspectos criticamente importantes. OAuth 2.0 e JWT (JSON Web Tokens) tornaram-se o padrão de facto para implementar autorização em APIs e aplicações web. Apesar de essas tecnologias serem mais frequentemente associadas a JavaScript, Python ou Java, C++ também oferece ferramentas poderosas para sua implementação.
Neste artigo, vamos analisar como funcionam OAuth 2.0 e JWT, e mostrar exemplos práticos de sua implementação em C++. O material é voltado para desenvolvedores iniciantes, familiarizados com os fundamentos de C++ e programação de rede.
O que é 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 (login e senha). Em vez disso, são usados tokens de acesso. Os papéis principais no OAuth 2.0 são:
- Resource Owner (Proprietário do recurso) — o usuário a quem os dados pertencem.
- Client (Cliente) — a aplicação que solicita acesso.
- Authorization Server (Servidor de autorização) — emite tokens após autenticação bem-sucedida.
- Resource Server (Servidor de recursos) — a API protegida por tokens.
O que é JWT?
JWT (JSON Web Token) é um formato de token compacto que contém um objeto JSON com dados (claims) e é assinado para verificação de integridade. A estrutura do JWT consiste em três partes, separadas por pontos:
- Header (Cabeçalho) — contém o tipo de token e o algoritmo de assinatura (por exemplo, HS256 ou RS256).
- Payload (Carga útil) — contém os dados (por exemplo, ID do usuário, prazo de validade).
- Signature (Assinatura) — criada através do hash de header + payload usando uma chave secreta.
A vantagem do JWT é que ele é autossuficiente: o servidor de recursos pode verificar o token sem consultar o servidor de autorização, o que acelera o funcionamento.
Parte principal: Implementação em C++
1. Bibliotecas e preparação do ambiente
Para trabalhar com OAuth 2.0 e JWT em C++, precisaremos das seguintes bibliotecas:
- cURL (libcurl) — para requisições HTTP ao servidor de autorização.
- nlohmann/json — para trabalhar com JSON.
- jwt-cpp — para criar e verificar tokens JWT.
- OpenSSL — para operações criptográficas (assinatura e hash).
Instalação via vcpkg (recomendado):
vcpkg install curl jsoncpp jwt-cpp opensslExemplo de CMakeLists.txt:
cmake_minimum_required(VERSION 3.15)project(OAuthJWTExample)
find_package(CURL REQUIRED)find_package(nlohmann_json REQUIRED)find_package(jwt-cpp REQUIRED)find_package(OpenSSL REQUIRED)
add_executable(main main.cpp)target_link_libraries(main CURL::libcurl nlohmann_json::nlohmann_json jwt-cpp::jwt-cpp OpenSSL::SSL OpenSSL::Crypto)2. Implementação do Fluxo de Código de Autorização OAuth 2.0
Vamos considerar o fluxo mais comum — Authorization Code Flow. O cliente obtém um código de autorização do usuário e, em seguida, o troca por um token de acesso.
Passo 1: Redirecionamento do usuário para o servidor de autorização (exemplo simplificado):
#include <iostream>#include <string>
std::string buildAuthUrl(const std::string& clientId, const std::string& redirectUri) { return "https://auth.example.com/authorize?" "response_type=code&" "client_id=" + clientId + "&" "redirect_uri=" + redirectUri + "&" "scope=openid+profile";}
int main() { std::string clientId = "your_client_id"; std::string redirectUri = "http://lo