cpp-httplib库:用于Web应用的C++ OAuth 2.0客户端

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用cpp-httplib的C++ OAuth 2.0客户端



在现代软件开发中,通过OAuth 2.0与外部服务集成已成为事实上的标准。对于传统上与系统编程相关联的C++语言,有几种实现OAuth客户端的方法。最轻量且高效的解决方案之一是cpp-httplib库——一个单头文件的HTTP/HTTPS库,无需外部依赖即可创建服务器端和客户端应用程序。



在本文中,我们将探讨如何使用cpp-httplib构建一个完整的OAuth 2.0客户端,该客户端可以通过Google、GitHub、VK及其他提供商进行授权。内容面向希望为桌面或嵌入式应用程序添加身份验证功能的C++程序员。



什么是cpp-httplib?



cpp-httplib(也称为httplib.h)是一个用于C++11/14/17的仅头文件库,由Yuji Hirose编写。它提供了简单直观的API,用于执行HTTP请求和创建HTTP服务器。支持SSL/TLS(通过OpenSSL或MbedTLS)、代理、cookies和异步请求。



  • 仅头文件——只需将一个文件复制到项目中。
  • 支持HTTPS——为OAuth提供安全连接。
  • 体积小——约8000行代码。
  • 跨平台——Windows、Linux、macOS、BSD。


对于OAuth 2.0,我们需要向提供商的端点执行GET和POST请求,并处理重定向。cpp-httplib在这方面表现出色。



C++ OAuth 2.0客户端架构



典型的OAuth 2.0授权码流程包括以下步骤:

  1. 应用程序在用户浏览器中打开授权URL。
  2. 用户确认访问权限。
  3. 提供商将带有临时代码的回调URL重定向。
  4. 应用程序用代码交换访问令牌。
  5. 使用令牌向API发出请求。


在C++中,我们可以通过启动一个本地HTTP服务器(基于cpp-httplib)来捕获回调,从而实现这一点。或者,也可以使用内置浏览器并通过系统事件跟踪URL,但服务器端方法更简单。



实现示例:通过GitHub进行OAuth



让我们看一个完整的客户端示例,该客户端通过GitHub OAuth进行授权。首先需要在GitHub上注册一个OAuth App,并获取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 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 + "?clien

推荐