2015-04-10 2 views
1

Я пытаюсь создать простой скрипт PHP, который вызывает два разных API REST на двух разных доменах. Обе службы - HTTPS и требуют аутентификации. Когда я локон от терминала, я получаю ответ в формате JSON для обоих доменов и все работает прекрасно:Проверенный curl не работает в php

локон --user «MyUser: MyPassword» https://www.example.com/rest/api/2/projects

Обратите внимание, что это GET, не POST ,

Странно то, что когда я пытаюсь выполнить одни и те же команды curl из моего PHP-скрипта, ни один из них не работает.

Это то, что происходит:

  • Первый домен возвращает пустой массив JSON без каких-либо ошибок. Просто это: []
  • Второй домен возвращает эту ошибку в JSON:

    { "ошибки": [ { "контекст": нулевой, "сообщение": "Вы не имеете доступа к этой ресурс», "exceptionName": "com.atlassian.stash.exception.AuthorisationException" } ]}

Вот что НЕ происходит:

  • Отсутствие ошибок или предупреждений SSL-сертификата
  • Ошибок при аутентификации.

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

Для меня подозрительно, что оба домена не аутентифицируют мои вызовы, что заставляет меня думать, что есть проблема с моим кодом или в библиотеке php curl.

Вот мой код:

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $link3); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$encodedAuth = base64_encode($username.":".$password); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authentication : Basic ".$encodedAuth)); 
curl_setopt($curl, CURLOPT_USERPWD, $username.":".$password); 
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,true); 
curl_setopt($curl, CURLINFO_HEADER_OUT, true); 
$status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); //get status code 

Я знаю, что некоторые из них является излишним, но я хотел бы попробовать все, и ничего не работает. Есть идеи?

Моя среда:

  • OS X Yosemite (10.10.2)
  • PHP 5.6.6 (я вручную обновлен до последней версии, как попытка сделать эту работу)

ответ

1

текущий код смешивает различные подходы и делает это конфликтующим образом:

  • заголовок аутентификации по имени Authorization: и не Authentication:
  • в CURLOPT_HTTPAUTH, CURLAUTH_ANY пытается вести переговоры с сервером, и он не должен (ни делает рабочий Curl командной строки)

Ju st use:

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $link3); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_USERPWD, $username.":".$password); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,true); 
# for debugging/non-prod 
#curl_setopt($curl, CURLOPT_VERBOSE, true); 
#curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
$result = curl_exec($curl); 
curl_close($curl); 
echo $result; 
+0

Hans, я попробовал много разных комбинаций заголовков выше, но я не думаю, что когда-либо забывал CURLOPT_HTTPAUTH. Я попробую, как только я вернусь в офис в понедельник, и я буду отмечать ваш ответ правильно, если это сработает. Я не очень оптимистичен в этот момент, но я действительно надеюсь, что вы правы :-) – Andy

+0

Спасибо, благодарю вас, спасибо! Работает красиво. – Andy

Смежные вопросы