Ключ доступа в C++
Закрытые API проверяют ключ в заголовке
"Authorization".
Форма "Bearer" с пробелом и секретом -
распространенный вариант. В libcurl пару имя-значение
добавляют в список curl_slist так же, как
"Content-Type". Ниже строка
"Bearer demo-token" - учебная заглушка,
не настоящий секрет:
#include <iostream>
#include <string>
#include <curl/curl.h>
size_t writeBody(
char* ptr,
size_t size,
size_t nmemb,
void* userdata
) {
auto* body = static_cast<std::string*>(userdata);
body->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
struct curl_slist* headers = nullptr;
headers = curl_slist_append(
headers,
"Authorization: Bearer demo-token"
);
std::string body;
curl_easy_setopt(
curl,
CURLOPT_URL,
"https://jsonplaceholder.typicode.com/users/1"
);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
long code = 0;
curl_easy_getinfo(
curl,
CURLINFO_RESPONSE_CODE,
&code
);
std::cout << code << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return res == CURLE_OK ? 0 : 1;
}
Учебный каталог typicode не отклоняет запрос без ключа,
но на боевых сервисах тот же адрес без заголовка часто
дает отказ. Сравним код ответа при чтении без
"Authorization":
#include <iostream>
#include <string>
#include <curl/curl.h>
size_t writeBody(
char* ptr,
size_t size,
size_t nmemb,
void* userdata
) {
auto* body = static_cast<std::string*>(userdata);
body->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
std::string body;
curl_easy_setopt(
curl,
CURLOPT_URL,
"https://jsonplaceholder.typicode.com/users/1"
);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
long code = 0;
curl_easy_getinfo(
curl,
CURLINFO_RESPONSE_CODE,
&code
);
std::cout << code << "\n";
}
curl_easy_cleanup(curl);
curl_global_cleanup();
return res == CURLE_OK ? 0 : 1;
}