簡體   English   中英

如何在 C++ curl 代碼中設置授權承載標頭? 我得到的授權不足,即使它在命令行上工作

[英]How do I set authorization bearer header in C++ curl code? I'm getting insufficient authorization, eventhough it works at the command line

我正在嘗試獲取使用 curl.h 庫的 C++ 代碼來發出需要設置 Authorization: Bearer 標頭的 curl 請求。 我正在使用 Linux Mint 18 (Ubuntu)。

我已經從命令行發出了這個 curl 請求,它可以工作,它看起來像這樣:

curl -H "Content-Type: application/json" -H "Authorization: Bearer <my_token>" <my_url>

這樣做會返回一個有效的結果。

但是,我嘗試使用 curl.h 庫在 C++ 中為此編寫等效的代碼,但我得到了{"errorMessage":"Insufficient authorization to perform request."}

這是我使用的 C++ 代碼:

#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <curl/curl.h>

using namespace std;

int main(int argc, char** argv)
{
    CURL* curl = curl_easy_init();

    if (!curl) {
        cerr << "curl initialization failure" << endl;
        return 1;
    }

    CURLcode res;

    // the actual code has the actual url string in place of <my_url>
    curl_easy_setopt(curl, CURLOPT_URL, <my_url>);

    struct curl_slist* headers = NULL;
    curl_slist_append(headers, "Content-Type: application/json");

    // the actual code has the actual token in place of <my_token>
    curl_slist_append(headers, "Authorization: Bearer <my_token>");

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    res = curl_easy_perform(curl);

    if (res != CURLE_OK) {
        cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << endl;
    }

    curl_easy_cleanup(curl);

    return 0;
}

我也嘗試過使用如下所示的行:

curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, <my_token>);

代替這一行:

curl_slist_append(headers, "Authorization: Bearer <my_token>");

我也嘗試在curl_easy_perform之前添加這些行:

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

因為我在四處搜索時看到了這些線條

但是我所有努力弄清楚如何讓這個工作仍然給我留下“錯誤消息:執行請求的授權不足”。

而且,是的,我順便確保我使用的 url 和令牌都是正確的。

我做錯了什么,如何將頂部的命令行代碼正確轉換為等效的 C++ 代碼。

您需要在每次調用curl_slist_append()的返回值分配給headers ,如下所示:

headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "Authorization: Bearer <my_token>");

請參閱此文檔

您調用它的方式headers將始終保持為 NULL,這就是您傳遞給curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

我對CURLOPT_XOAUTH2_BEARER有同樣的問題。 解決方案是將CURLOPT_HTTPAUTHCURLAUTH_BEARER ,如下所示:

curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, "<my_token>");
curl_easy_setopt(_connection, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);

CURLAUTH_BEARER是在 7.61.0 中添加的。 如果您的 libcurl 較舊,則CURLAUTH_ANY應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM