Мы используем службу 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
?
Заголовок Authorization
не включен в переменную $_SERVER
PHP. Чтобы правильно отладить запрос, вы должны использовать apache_request_headers()
который показывает, что мы отправляли заголовок Authorization
точно так, как мы хотели.
Затем проблема перешла к выяснению, что именно следует добавить в заголовок Authorization
учитывая некоторые довольно плохие документы.
Когда заголовок задается клиентом, тогда запрос Authorization
от запроса включается в $_SERVER
– не уверен, что это что-то новое, но оно есть сейчас. HTTP-заголовки получают префикс в массиве $_SERVER
с HTTP_
который может быть чем-то, что вы ранее упускали из виду.
Кроме того, apache_request_headers()
– это функция, которая определяется только при использовании Apache в качестве веб-сервера. Поэтому все с nginx и т. Д. Не учитываются.
На стороне сервера:
<?php // server.php var_dump($_SERVER['HTTP_AUTHORIZATION']);
Запустите веб-сервер (требуется 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"
Работает. 🙂