最简单可靠的方式是直接在请求头中设置 authorization: bearer ;libcurl 不内置 oauth2 逻辑,需自行获取并管理 access_token,通过 curl_slist_append 构建 header 并用 curlopt_httpheader 设置,且必须在 curl_easy_perform 前调用,最后释放内存。

如何在C++中用libcurl设置Authorization Bearer头
直接在请求头里写 Authorization: Bearer <token></token> 是最简单可靠的方式,libcurl 不内置 OAuth2 逻辑,所有 token 管理必须由你负责。
常见错误是试图用 curl_easy_setopt(curl, CURLOPT_USERPWD, ...) 或 CURLOPT_HTTPAUTH——这些只适用于 Basic/Digest 认证,对 Bearer 完全无效,会静默失败或返回 401。
- 先确保你已通过 OAuth2 流程(如 Authorization Code + PKCE)拿到有效的 access_token,libcurl 不参与任何 token 获取过程
- 用
curl_slist* headers = curl_slist_append(nullptr, "Authorization: Bearer YOUR_TOKEN_HERE");构建头列表 - 调用
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);设置,且必须在curl_easy_perform()前执行 - 记得最后用
curl_slist_free_all(headers);释放内存,否则泄漏
为什么 CURLOPT_HTTPHEADER 比手动拼接 URL 更安全
把 token 放 query string(如 ?access_token=xxx)看似简单,但实际极不推荐:token 可能被服务器日志、代理缓存、CDN 记录,且某些服务明确拒绝 query 中传 token。
CURLOPT_HTTPHEADER 把认证信息严格限定在 HTTP 请求头内,符合 RFC 6750 规范,也避免 URL 编码问题(比如 token 含 + 或 / 时,query 里需额外 encode,header 里直接放 raw token 即可)。
基于5000余部现行法律法规进行的高质量专业合同审查,一键输出审查意见书,并附有参考法条原文,满足专业溯源核查要求。由accurLex知法提供技术支持。 Use when users ask for 合同审查, 审查意见书, 合同风险分析, 条款审查,知法,accurLex or 站在甲方/乙方角度审查合同 through accurLex direct API. China law only, plaintext only, review mode limited to 审查意见书.
- Bearer token 本身不含特殊字符?别赌——OAuth2 provider 返回的 JWT 可能含 base64url 编码的
+和/,URL 中未正确 encode 就会损坏 - 某些 API(如 Google APIs)明确要求 token 必须在 header,query 方式直接返回 401 或 403
- 如果你用
CURLOPT_URL拼接带 token 的 URL,libcurl 不会自动帮你 encode token 部分,得手动调curl_easy_escape(),麻烦且易错
发送 POST 请求并携带 JSON body 和 OAuth2 头的典型组合
很多 API 要求 POST + JSON + Bearer,这时 header 和 body 设置顺序和参数互不影响,但漏掉任一环节都会失败。
- 先设
CURLOPT_HTTPHEADER(含 Authorization 和 Content-Type) - 再设
CURLOPT_POSTFIELDS或CURLOPT_COPYPOSTFIELDS,注意后者更安全(libcurl 自行 copy 内存) - 必须显式设置
Content-Type: application/json,否则某些服务(如 GitHub API)会拒收 - 如果用
CURLOPT_POSTFIELDS传字符串,确保该字符串以\0结尾;若传二进制 JSON(如从文件读取),改用CURLOPT_POSTFIELDSIZE显式指定长度
示例关键片段:
curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Authorization: Bearer ya29.a0...");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"name\":\"test\"}");
curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, 1);
调试 401 错误时优先检查哪几个点
OAuth2 场景下 401 最常不是因为 token 错,而是 token 格式、作用域或传输方式不对。
- 用
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L)开启详细日志,确认 header 真的发出去了(看 log 里是否有> Authorization: Bearer xxx) - 检查 token 是否过期——libcurl 不自动刷新,你得自己维护 token 生命周期,比如缓存 token + 刷新逻辑
- 确认 token 的 scope 匹配目标 API 所需权限(例如访问 Gmail API 需
https://www.googleapis.com/auth/gmail.readonly,少一个字符就 403) - 有些服务(如 Microsoft Graph)要求 header 中的 token 必须是原始 JWT 字符串,不能带额外空格或换行——打印 token 变量看看前后有没有不可见字符
真正麻烦的不是发请求,而是 token 怎么拿、怎么续、怎么存——libcurl 只管“发”,不管“证”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










