Cliente OAuth 2.0 em C++ usando cpp-httplib
\n\nNo desenvolvimento de software moderno, a integração com serviços externos via OAuth 2.0 tornou-se o padrão de facto. Para a linguagem C++, que tradicionalmente é associada à programação de sistemas, existem várias maneiras de implementar um cliente OAuth. Uma das soluções mais leves e eficientes é a biblioteca cpp-httplib — uma biblioteca HTTP/HTTPS de cabeçalho único que permite criar aplicações tanto do lado do servidor quanto do lado do cliente, sem dependências externas.
\n\nNeste artigo, vamos analisar como usar cpp-httplib para construir um cliente OAuth 2.0 completo, que pode autenticar via Google, GitHub, VK e outros provedores. O material é voltado para programadores C++ que desejam adicionar autenticação a aplicações desktop ou embarcadas.
\n\nO que é cpp-httplib?
\n\ncpp-httplib (também conhecida como httplib.h) é uma biblioteca header-only para C++11/14/17, escrita por Yuji Hirose. Ela fornece uma API simples e intuitiva para realizar requisições HTTP e criar servidores HTTP. Suporta SSL/TLS (via OpenSSL ou MbedTLS), proxies, cookies e requisições assíncronas.
- \n
- Header-only — basta copiar um arquivo para o projeto. \n
- Suporte a HTTPS — conexão segura para OAuth. \n
- Tamanho reduzido — cerca de 8000 linhas de código. \n
- Multiplataforma — Windows, Linux, macOS, BSD. \n
Para OAuth 2.0, precisaremos fazer requisições GET e POST para os endpoints do provedor, além de lidar com redirecionamentos. O cpp-httplib lida com isso perfeitamente.
\n\nArquitetura do cliente OAuth 2.0 em C++
\n\nO fluxo típico do Authorization Code do OAuth 2.0 inclui as seguintes etapas:
\n- \n
- A aplicação abre o navegador do usuário com a URL de autorização. \n
- O usuário confirma o acesso. \n
- O provedor redireciona para a URL de callback com um código temporário. \n
- A aplicação troca o código por um access token. \n
- Com o token, são feitas requisições à API. \n
Em C++, podemos implementar isso iniciando um servidor HTTP local (com cpp-httplib) para capturar o callback. Alternativamente, podemos usar o navegador embutido e monitorar a URL através de eventos do sistema, mas a abordagem com servidor é mais simples.
\n\nExemplo de implementação: OAuth via GitHub
\n\nVamos considerar um exemplo completo de um cliente que autentica via GitHub OAuth. Para funcionar, é necessário registrar um OAuth App no GitHub e obter o Client ID e o Client Secret.
\n\n#include <httplib.h>\n#include <iostream>\n#include <string>\n#include <thread>\n#include <regex>\n\n// Configuração\nconst std::string CLIENT_ID = "seu_client_id";\nconst std::string CLIENT_SECRET = "seu_client_secret";\nconst std::string REDIRECT_URI = "http://localhost:8080/callback";\nconst std::string AUTH_URL = "https://github.com/login/oauth/authorize";\nconst std::string TOKEN_URL = "https://github.com/login/oauth/access_token";\nconst std::string API_URL = "https://api.github.com/user";\n\nstd::string auth_code;\n\nvoid start_local_server() {\n httplib::Server svr;\n \n svr.Get("/callback", [&](const httplib::Request& req, httplib::Response& res) {\n // Extrai o code dos parâmetros da query\n if (req.has_param("code")) {\n auth_code = req.get_param_value("code");\n res.set_content("<h2>Autorização bem-sucedida! Feche a janela.</h2>", "text/html");\n svr.stop();\n } else {\n res.set_content("<h2>Erro de autorização</h2>", "text/html");\n }\n });\n \n std::cout << "Servidor iniciado na porta 8080..." << std::endl;\n svr.listen("0.0.0.0", 8080);\n}\n\nint main() {\n // Passo 1: Monta a URL de autorização\n std::string auth_url = AUTH_URL + "?clien