Задайте заголовок авторизации с помощью PHP и curl
Мы используем службу REST службы Commission Junction, которая требует, чтобы мы отправили ключ API в заголовок Authorization
.
Мы устанавливаем заголовок следующим образом:
$ch = curl_init();
curl_setopt_array($ch, array(
// set url, timeouts, encoding headers etc.
CURLOPT_URL => 'https://....',
// ...
));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: ' . CJ_API_KEY,
'User-Agent: ' . OUR_USER_AGENT
));
$response = curl_exec($ch);
$info = curl_getinfo($ch);
Проблема заключается в том, что заголовок Authorization
не отправляется (мы отлаживаем это с помощью локального url и делаем var_export($_SERVER)
, который показывает заголовок User-Agent
, но не заголовок Authorization
).
Если мы изменим имя заголовка на X-Authorization
, оно будет отправлено, но это нам не помогло, так как службе требуется специальный заголовок Authorization
.
Как мы получаем PHP + cURL для отправки произвольного заголовка Authorization
?
Ответы
Ответ 1
Заголовок Authorization
не включен в переменную PHP $_SERVER
. Чтобы правильно отладить запрос, вы должны использовать apache_request_headers()
, который показывает, что мы отправляли заголовок Authorization
точно так, как мы хотели.
Затем проблема перешла к выяснению, что именно нужно вставить в заголовок Authorization
, учитывая некоторые довольно плохие документы.
Ответ 2
Когда заголовок задается клиентом, тогда Authorization
-header из запроса включается в $_SERVER
- не уверен, что это что-то новое, но оно сейчас. HTTP-заголовки получают префикс в массиве $_SERVER
с помощью HTTP_
, который может быть чем-то, что вы ранее не учитывали.
Кроме того, apache_request_headers()
- это функция, которая определяется только при использовании Apache в качестве веб-сервера. Поэтому все с nginx и т.д. Не учитываются.
Demo
На стороне сервера:
<?php
// server.php
var_dump($_SERVER['HTTP_AUTHORIZATION']);
Test
Запустите веб-сервер (требуется PHP 5.4):
$ php -S 0.0.0.0:31337 -t .
Убедитесь, что server.php находится в текущем каталоге.
Используйте cURL для тестирования:
$ curl -H 'Authorization: FOO' http://0.0.0.0:31337/server.php
string(3) "FOO"
Работает.:)