Установить заголовок авторизации, используя PHP и curl - PullRequest
21 голосов
/ 20 августа 2009

Мы используем службу 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?

Ответы [ 2 ]

30 голосов
/ 20 августа 2009

Заголовок Authorization не включен в переменную PHP $_SERVER. Для правильной отладки запроса вы должны использовать apache_request_headers(), который показывает, что мы отправляли заголовок Authorization именно так, как мы хотели.

Затем проблема перешла к выяснению, что именно нужно поместить в заголовок Authorization, учитывая довольно плохую документацию.

4 голосов
/ 17 января 2013

Когда заголовок установлен клиентом, тогда заголовок Authorization из запроса включается в $_SERVER - не уверен, что это что-то новое, но это сейчас. Заголовки HTTP имеют префикс в массиве $_SERVER с HTTP_, который может быть чем-то, что вы ранее пропустили.

Кроме того, apache_request_headers() - это функция, которая определяется только при использовании Apache в качестве веб-сервера. Так что все с nginx и т. Д. Не учтены.

Демо

На стороне сервера:

<?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"

Работает. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...