我正在使用 C 语言的 libcurl 库编写一个 REST API 来登录我的网页。但每次我都会收到 401 未经授权的错误。下面是代码
int main(int argc, const char* args[])
{
CURL *curl;
CURLcode res;
struct curl_slist *header = NULL;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://samplewebpage.com/rest/api/2/issue");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
header = curl_slist_append(header, "Content-Type: application/x-www-form-urlencoded");
header = curl_slist_append(header, "Authorization: Basic ");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
curl_easy_setopt(curl, CURLOPT_USERPWD, "SharedIP:SharedIP@123");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
curl_slist_free_all(header);
/* Check for errors */
if (res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: error %d %s\n", res,
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
最佳答案
您正在混合自己动手和让 libcurl 来做,两者都只做了一半。
你自己
您可以自己添加 HTTP 授权 header ,但这不是有效的此类 header :
header = curl_slist_append(header, "Authorization: Basic ");
您缺少“Basic”之后的 base64("user:password") 部分。类似这样:
header = curl_slist_append(header, "Authorization: Basic aWFtOm15OjtzZWxm");
让 libcurl 来做
然后您不手动传递Authorization:
header ,而是要求libcurl 处理身份验证。您可以通过像您已经做的那样设置 CURLOPT_USERPWD
选项来做到这一点 - 但在您的情况下,您会通过自己的自定义(损坏的) header 破坏它,该 header 会覆盖内部生成的 header 。
关于php - 我正在使用 C 语言的 libcurl 库编写一个 REST API 来登录我的网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54572834/