OAuth 2.0 клиент на C++ с использованием cpp-httplib
В современной разработке программного обеспечения интеграция с внешними сервисами через OAuth 2.0 стала стандартом де-факто. Для языка C++, который традиционно ассоциируется с системным программированием, существует несколько способов реализации OAuth-клиента. Одним из наиболее лёгких и эффективных решений является библиотека cpp-httplib — одноголовочная HTTP/HTTPS библиотека, которая позволяет создавать как серверные, так и клиентские приложения без внешних зависимостей.
В этой статье мы разберём, как использовать cpp-httplib для построения полноценного OAuth 2.0 клиента, который может авторизоваться через Google, GitHub, VK и другие провайдеры. Материал ориентирован на C++ программистов, желающих добавить аутентификацию в десктопные или встраиваемые приложения.
Что такое cpp-httplib?
cpp-httplib (также известная как httplib.h) — это header-only библиотека для C++11/14/17, написанная Yuji Hirose. Она предоставляет простой и интуитивно понятный API для выполнения HTTP-запросов и создания HTTP-серверов. Поддерживает SSL/TLS (через OpenSSL или MbedTLS), прокси, cookies и асинхронные запросы.
- Header-only — достаточно скопировать один файл в проект.
- Поддержка HTTPS — безопасное соединение для OAuth.
- Малый размер — около 8000 строк кода.
- Кроссплатформенность — Windows, Linux, macOS, BSD.
Для OAuth 2.0 нам потребуется выполнять GET и POST запросы к эндпоинтам провайдера, а также обрабатывать редиректы. cpp-httplib справляется с этим на отлично.
Архитектура OAuth 2.0 клиента на C++
Типичный OAuth 2.0 Authorization Code Flow включает следующие шаги:
- Приложение открывает браузер пользователя с URL авторизации.
- Пользователь подтверждает доступ.
- Провайдер перенаправляет на callback URL с временным кодом.
- Приложение обменивает код на access token.
- С помощью токена выполняются запросы к API.
В C++ мы можем реализовать это, запустив локальный HTTP-сервер (на cpp-httplib) для перехвата callback. Альтернативно — использовать встроенный браузер и отслеживать URL через системные события, но серверный подход проще.
Пример реализации: OAuth через GitHub
Рассмотрим полный пример клиента, который авторизуется через GitHub OAuth. Для работы потребуется зарегистрировать OAuth App на GitHub и получить Client ID и Client Secret.
#include <httplib.h>
#include <iostream>
#include <string>
#include <thread>
#include <regex>
// Конфигурация
const std::string CLIENT_ID = "ваш_client_id";
const std::string CLIENT_SECRET = "ваш_client_secret";
const std::string REDIRECT_URI = "http://localhost:8080/callback";
const std::string AUTH_URL = "https://github.com/login/oauth/authorize";
const std::string TOKEN_URL = "https://github.com/login/oauth/access_token";
const std::string API_URL = "https://api.github.com/user";
std::string auth_code;
void start_local_server() {
httplib::Server svr;
svr.Get("/callback", [&](const httplib::Request& req, httplib::Response& res) {
// Извлекаем code из query параметров
if (req.has_param("code")) {
auth_code = req.get_param_value("code");
res.set_content("<h2>Авторизация успешна! Закройте окно.</h2>", "text/html");
svr.stop();
} else {
res.set_content("<h2>Ошибка авторизации</h2>", "text/html");
}
});
std::cout << "Сервер запущен на порту 8080..." << std::endl;
svr.listen("0.0.0.0", 8080);
}
int main() {
// Шаг 1: Формируем URL авторизации
std::string auth_url = AUTH_URL + "?client_id=" + CLIENT_ID
+ "&redirect_uri=" + REDIRECT_URI
+ "&scope=read:user";
std::cout << "Откройте в браузере: " << auth_url << std::endl;
// Шаг 2: Запускаем локальный сервер для получения callback
std::thread server_thread(start_local_server);
server_thread.join();
if (auth_code.empty()) {
std Также в библиотеке
WebSocket библиотеки Kotlin для создания реального времени в веб-приложениях
Тестирование в C++: обзор фреймворков и инструментов (Google Test, Catch2, doctest)
ExcelJS для JavaScript (Node.js): полное руководство с примерами
Retrofit для Kotlin: полное руководство с примерами
csv — Работа с CSV файлами в Rust