OAuth 2.0 Client in C++ Using cpp-httplib
In modern software development, integration with external services via OAuth 2.0 has become the de facto standard. For the C++ language, which is traditionally associated with system programming, there are several ways to implement an OAuth client. One of the lightest and most efficient solutions is the cpp-httplib library — a single-header HTTP/HTTPS library that allows you to create both server and client applications without external dependencies.
In this article, we will explore how to use cpp-httplib to build a full-fledged OAuth 2.0 client that can authenticate via Google, GitHub, VK, and other providers. The material is aimed at C++ programmers who want to add authentication to desktop or embedded applications.
What is cpp-httplib?
cpp-httplib (also known as httplib.h) is a header-only library for C++11/14/17 written by Yuji Hirose. It provides a simple and intuitive API for making HTTP requests and creating HTTP servers. It supports SSL/TLS (via OpenSSL or MbedTLS), proxies, cookies, and asynchronous requests.
- Header-only — just copy one file into your project.
- HTTPS support — secure connection for OAuth.
- Small footprint — about 8000 lines of code.
- Cross-platform — Windows, Linux, macOS, BSD.
For OAuth 2.0, we will need to make GET and POST requests to the provider's endpoints, as well as handle redirects. cpp-httplib handles this perfectly.
Architecture of an OAuth 2.0 Client in C++
A typical OAuth 2.0 Authorization Code Flow includes the following steps:
- The application opens the user's browser with the authorization URL.
- The user confirms access.
- The provider redirects to the callback URL with a temporary code.
- The application exchanges the code for an access token.
- Requests to the API are made using the token.
In C++, we can implement this by starting a local HTTP server (using cpp-httplib) to intercept the callback. Alternatively, we could use an embedded browser and track the URL via system events, but the server approach is simpler.
Implementation Example: OAuth via GitHub
Let's look at a complete example of a client that authenticates via GitHub OAuth. To make it work, you need to register an OAuth App on GitHub and obtain a Client ID and Client Secret.
#include <httplib.h>#include <iostream>#include <string>#include <thread>#include <regex>
// Configurationconst std::string CLIENT_ID = "your_client_id";const std::string CLIENT_SECRET = "your_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) { // Extract code from query parameters if (req.has_param("code")) { auth_code = req.get_param_value("code"); res.set_content("<h2>Authorization successful! Close the window.</h2>", "text/html"); svr.stop(); } else { res.set_content("<h2>Authorization error</h2>", "text/html"); } }); std::cout << "Server started on port 8080..." << std::endl; svr.listen("0.0.0.0", 8080);}
int main() { // Step 1: Form the authorization URL std::string auth_url = AUTH_URL + "?clien