Библиотека cpp-httplib: OAuth 2.0 клиент на C++ для веб-приложений

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 включает следующие шаги:

  1. Приложение открывает браузер пользователя с URL авторизации.
  2. Пользователь подтверждает доступ.
  3. Провайдер перенаправляет на callback URL с временным кодом.
  4. Приложение обменивает код на access token.
  5. С помощью токена выполняются запросы к 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                    

Рекомендаций