OAuth клиент для C++: библиотека liboauthcpp
В современной веб-разработке интеграция с внешними API через протокол OAuth стала стандартом де-факто. Для C++ разработчиков создание надежного OAuth-клиента может быть нетривиальной задачей из-за отсутствия встроенной поддержки в стандартной библиотеке. liboauthcpp — это легковесная, кроссплатформенная библиотека на C++, которая предоставляет готовые механизмы для работы с OAuth 1.0a и частичной поддержкой OAuth 2.0. Она идеально подходит для встраивания в desktop-приложения, серверные утилиты и IoT-устройства, где критичны производительность и минимальные зависимости.
Основные возможности
- Поддержка OAuth 1.0a — полная реализация HMAC-SHA1 и RSA-SHA1 подписей.
- Базовые механизмы OAuth 2.0 — получение Authorization Code и Client Credentials (без Refresh Token).
- Минимальные зависимости — требуется только C++11/14 компилятор и OpenSSL (или альтернативный крипто-провайдер).
- Кроссплатформенность — работает на Linux, macOS, Windows (MinGW/MSVC).
- Простой API — интуитивно понятные классы
OAuthClient,OAuthToken,OAuthRequest.
Установка
Рекомендуемый способ установки — через систему пакетов vcpkg или сборка из исходников:
# Через vcpkg
vcpkg install liboauthcpp
# Или сборка из GitHub
git clone https://github.com/lyokato/liboauthcpp.git
cd liboauthcpp
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make && sudo make install
После установки подключите заголовочный файл и линкуйтесь с библиотекой:
#include <oauthcpp/oauthcpp.hpp>
// Линковка: -loauthcpp -lssl -lcrypto
Пример: OAuth 1.0a (Twitter API)
Рассмотрим классический сценарий — отправка твита через Twitter API v1.1 с использованием OAuth 1.0a:
#include <iostream>
#include <oauthcpp/oauthcpp.hpp>
#include <curl/curl.h> // Для HTTP-транспорта
int main() {
// 1. Инициализация учетных данных
oauthcpp::OAuthClient client(
"YOUR_CONSUMER_KEY",
"YOUR_CONSUMER_SECRET",
oauthcpp::OAuthClient::HttpMethod::POST
);
// 2. Установка токенов пользователя (получены ранее)
oauthcpp::OAuthToken accessToken(
"USER_ACCESS_TOKEN",
"USER_TOKEN_SECRET"
);
client.setToken(accessToken);
// 3. Формирование запроса
std::string url = "https://api.twitter.com/1.1/statuses/update.json";
oauthcpp::OAuthRequest request(url);
request.addParameter("status", "Привет из C++ OAuth клиента!");
// 4. Подпись запроса
std::string signedUrl = client.sign(request);
// 5. Отправка через libcurl
CURL* curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, signedUrl.c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1L);
// ... настройка SSL и обработка ответа
curl_easy_perform(curl);
curl_easy_cleanup(curl);
return 0;
}
Пример: OAuth 2.0 (Google API)
Для работы с OAuth 2.0 используйте упрощенный механизм OAuth2Client (входит в состав liboauthcpp):
#include <iostream>
#include <oauthcpp/oauth2.hpp>
int main() {
oauthcpp::OAuth2Client client(
"YOUR_CLIENT_ID",
"YOUR_CLIENT_SECRET",
"https://oauth2.googleapis.com/token"
);
// Получение токена через Authorization Code
std::string authCode = "AUTH_CODE_FROM_REDIRECT";
oauthcpp::OAuthToken token = client.getAccessToken(authCode,
"https://your-app.com/callback");
std::cout << "Access Token: " << token.getAccessToken() << std::endl;
std::cout << "Expires in: " << token.getExpiresIn() << " seconds" << std::endl;
// Использование токена в запросе
std::string apiUrl = "https://www.googleapis.com/oauth2/v1/userinfo";
std::string response = client.get(apiUrl, token);
return 0;
}