Подтвердить что ты не робот

Задайте заголовок авторизации с помощью 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?

4b9b3361

Ответ 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"

Работает.:)