如何在C ++ curl代码中设置授权承载标头?我的授权不足,尽管它可以在命令行上运行

时间:2018-07-26 14:02:23

标签: c++ curl libcurl bearer-token

我正在尝试获取使用curl.h库执行要求设置Authorization:Bearer标头设置的curl请求的C ++代码。我正在使用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);

因为我在搜索时看到了这些行

但是我为弄清楚该工作方式所做的所有努力仍然使我感到“ errorMessage:执行请求的权限不足。”

是的,我要确保我使用的网址和令牌都是正确的。

我在做什么错,以及如何正确地将顶部的命令行代码转换为等效的C ++代码。

2 个答案:

答案 0 :(得分:2)

在每次这样的调用中,您需要将curl_slist_append()的返回值分配给headers

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

请参见this doc

您称其为headers的方式将始终为NULL,这就是您传递给curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);的原因

答案 1 :(得分:2)

我对CURLOPT_XOAUTH2_BEARER有同样的问题。解决方案是将CURLOPT_HTTPAUTH设置为CURLAUTH_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应该可以使用。