php - 我正在使用 C 语言的 libcurl 库编写一个 REST API 来登录我的网页

标签 php c libcurl

我正在使用 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/

相关文章:

c - 从 Int 10h/AX=4F00h 检索 VESA 视频模式列表

c - PortAudio - 在单声道中工作,在立体声中出现故障?

git - 致命 : The remote end hung up unexpectedly libcurl result = 7

C++ 不能传递非 POD 类型的对象

C99:为什么我的字符串改变了?

php - mysql join 显示复制结果

php - file_get_contents() 使用的内存在未分配给变量时是否被释放?

php - Zend Framework 1 apache2 虚拟主机配置

c++ - 在 Valgrind 中仍然可以访问 libcurl C++ 代码的泄漏摘要

php - 用 JavaScript 解析 XML?