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

Заголовок 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" 

Работает. 🙂