C++ 中 OAuth 2.0 和 JWT 简介
\n\n现代 Web 应用程序和 API 几乎离不开授权系统。两个最流行的标准——OAuth 2.0 和 JWT(JSON Web Token)——已成为数百万服务的安全基础。在本文中,我们将探讨如何使用 C++ 语言实现基于 JWT 令牌的基本 OAuth 2.0 授权。您将了解这些协议的工作原理,并看到可直接适用于您项目的现成代码示例。
\n\n本文面向已经熟悉 C++ 基础知识(类、函数、网络编程)并希望为其应用程序添加安全授权的初级开发人员。我们不会使用第三方 HTTP 服务器库——所有示例均使用纯 C++ 编写,依赖项最少。
\n\n什么是 OAuth 2.0,为什么需要它?
\n\nOAuth 2.0 是一种授权协议,允许应用程序在不传递用户密码的情况下获取对用户资源的有限访问权限。想象一下,您希望允许某个应用程序访问您服务器上的照片。您无需输入用户名和密码,而是通过 授权服务器(Authorization Server),该服务器会颁发一个临时令牌。应用程序使用此令牌来访问资源。
\n\nOAuth 2.0 中的主要角色:
\n- \n
- 资源所有者(Resource Owner) — 用户,数据的所有者。 \n
- 客户端(Client) — 请求访问权限的应用程序。 \n
- 授权服务器(Authorization Server) — 在身份验证后颁发令牌的服务器。 \n
- 资源服务器(Resource Server) — 存储受保护数据的服务器(例如 API)。 \n
我们将使用 C++ 实现一个简化版的授权服务器和资源服务器,并使用 JWT 作为访问令牌。
\n\nJWT:结构和工作原理
\n\nJWT(JSON Web Token)是一种紧凑且自包含的方式,用于以 JSON 对象的形式在各方之间传输信息。令牌由三部分组成,用点分隔:
\n\nheader.payload.signature\n\nHeader 包含令牌类型和签名算法(通常为 HMAC SHA256 或 RSA)。Payload 是有效载荷:用户 ID、令牌生命周期、角色等。Signature 是用于验证数据完整性的签名。
\n\n在 C++ 中无需库即可创建 JWT 的示例(简化版):
\n\n#include <iostream>\n#include <sstream>\n#include <vector>\n#include <openssl/sha.h>\n#include <openssl/hmac.h>\n\nstd::string base64_encode(const std::string &input) {\n // 简化的 Base64 实现(示例)\n static const char* lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\n std::string result;\n // ... 编码代码 ...\n return result;\n}\n\nstd::string create_jwt(const std::string &payload, const std::string &secret) {\n std::string header = R"({"alg":"HS256","typ":"JWT"})";\n std::string header_b64 = base64_encode(header);\n std::string payload_b64 = base64_encode(payload);\n std::string data = header_b64 + "." + payload_b64;\n \n unsigned char* sig = HMAC(EVP_sha256(), secret.c_str(), secret.length(), \n (unsigned char*)data.c_str(), data.length(), NULL, NULL);\n std::string sig_b64 = base64_encode(std::string((char*)sig, 32));\n \n return data + "." + sig_b64;\n}\n\nint main() {\n std::string payload = R"({"user_id":123,"role":"admin","exp":1700000000})";\n std::string token = create_jwt(payload, "my_secret_key");\n std::cout << "JWT: " << token << std::endl;\n return 0;\n}\n\n此代码创建了一个带有 HS256 头部和有效载荷的 JWT。在实际项目中,请使用经过验证的库,例如 jwt-cpp 或 libjwt,但为了理解核心概念,这样的示例也足够了。