За последние 24 часа нас посетили 15564 программиста и 1550 роботов. Сейчас ищут 880 программистов ...

Базовая аутентификация к удаленному сервису

Тема в разделе "PHP для новичков", создана пользователем vlasenkov, 21 дек 2016.

  1. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте!
    Прошу помощи вот в каком вопросе.
    Есть сервис, которые предоставляет доступ к данным через XML. Дело в том, что доступ к этим данным он предоставляет, цитирую:
    Логин и пароль у меня есть. Данные я пытаюсь получить, используя simplexml_load_file.
    И вот хоть убей не понимаю как можно произвести эту аутентификацию удаленно. Пытался и в адресе просто передать логин и пароль, но не вышло.
    Поиск по интернету дает советы по тому как ее реализовать у себя, но как подключиться удаленно я не могу понять.

    UPD
    Попробовал еще таким образом:
    PHP:
    1. simplexml_load_file("https://login:pwd@site.ru");
    Но тоже не получается. Я что-то упускаю важное, но не пойму что, т/к в первый раз с таким сталкиваюсь.
     
    #1 vlasenkov, 21 дек 2016
    Последнее редактирование: 21 дек 2016
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
  3. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    @artoodetoo, попробовал через:
    PHP:
    1. file_get_contents("https://login:pwd@site.ru");
    Если я правильно понял, что это тоже должно работать из всех перечисленных способов (к сожалению с английский не очень). Но он тоже не работает.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Напиши когда добъешся успеха.
     
  5. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Попробовал таким способом:
    PHP:
    1. $opts = array(
    2.   'https'=>array(
    3.     'method'=>"GET",
    4.     'header' => "Authorization: Basic " . base64_encode("$username:$password")                
    5.   )
    6. );
    7.  
    8. $context = stream_context_create($opts);
    9.  
    10. // Open the file using the HTTP headers set above
    11. $file = file_get_contents($remote_url, false, $context);
    12.  
    13. print($file);
    Пишут: failed to open stream, как и до этого.
    Есть ли разница в подключении к http и https таким способом?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Разница есть конечно. ПХП может не иметь транспорта для ХТТПС. А ещё есть такая штука, как SSL Context. А может быть недоступен и http (ищи allow_url_fopen).

    Разложи задачу на составляющие и проверяй отдельно каждый нюанс.
     
    #6 artoodetoo, 21 дек 2016
    Последнее редактирование: 21 дек 2016
  7. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    @artoodetoo, не очень понял сообщение.
    Это значит что мне надо пробовать иной способ подключения или другие параметры для stream_context_create?
    Что значит не иметь транспорта? Разве нет просто функции подключения, вводишь нужные параметры и все?

    P.S.
    Я извиняюсь, просто эта тема для меня новая
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Это ты извини, я выработал весь запас доброты на сегодня.

    оффициальная документация и стековерфлоу = 90% успеха. гугль поможет
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    криптография не простая штука, попробуй через cURL сделать
     
  10. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    @denis01, попробовал таким образом:
    PHP:
    1. $headers = array(
    2.     'Content-Type: application/xml',
    3.     "Authorization: Basic ".base64_encode("$username:$password")
    4. );
    5.  
    6. $process = curl_init($urlCountries);
    7. curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
    8. curl_setopt($process, CURLOPT_HEADER, 1);
    9. curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
    10. curl_setopt($process, CURLOPT_TIMEOUT, 30);
    11. curl_setopt($process, CURLOPT_POST, 1);
    12. curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
    13. $return = curl_exec($process);
    14. curl_close($process);
    15.  
    16. print_r($return);
    Все также долго грузится, ошибок не пишет, но и ничего не выводит.
     
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    PHP:
    1. curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
    2. curl_setopt($curl, CURLOPT_USERPWD, "username:password");
     
    denis01 нравится это.
  12. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    @mahmuzar, добавил эту строчку:
    PHP:
    1. curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
    вторая с паролем у меня была уже, но все тоже самое.
    Вообще не понимаю что происходит, такое ощущение, что ошибка на уровне запятую забыл поставить, простая, но не понятно где и что.
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @vlasenkov, какой ответ дает сервер?
    --- Добавлено ---
    Установи плагин для браузера. У меня файрфокс я использую такой. Через него добейся ответа и правильных заголовков.
     
  14. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    @mahmuzar, понимаю что сейчас полетят тапки, но не знаю как это посмотреть, попробовал так:
    PHP:
    1. $headers = array(
    2.     'Content-Type: application/xml',
    3.     "Authorization: Basic ".base64_encode("$username:$password")
    4. );
    5.  
    6. $process = curl_init($urlCountries);
    7. curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
    8. curl_setopt($process, CURLOPT_HEADER, 1);
    9. curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
    10. curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
    11. curl_setopt($process, CURLOPT_TIMEOUT, 30);
    12. curl_setopt($process, CURLOPT_POST, 1);
    13. curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
    14. curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
    15. curl_setopt($process, CURLOPT_SSLVERSION, 3);
    16. curl_setopt($process, CURLOPT_SSL_VERIFYHOST, false);
    17. curl_setopt($process, CURLOPT_FAILONERROR, 0);
    18. $return = curl_exec($process);
    19. $error  = curl_error($process);
    20. $info   = curl_getinfo($process, CURLINFO_HTTP_CODE);
    21. curl_close($process);
    22.  
    23. echo $return.'<br>'.$error.'<br>'.$info;
    Добавил вот эти строки:
    PHP:
    1. curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
    2. curl_setopt($process, CURLOPT_SSLVERSION, 3);
    3. curl_setopt($process, CURLOPT_SSL_VERIFYHOST, false);
    4. curl_setopt($process, CURLOPT_FAILONERROR, 0);
    5. $return = curl_exec($process);
    6. $error  = curl_error($process);
    7. $info   = curl_getinfo($process, CURLINFO_HTTP_CODE);
    и вывод error и info

    получил следующее:
    error = Connection timed out after 30001 milliseconds
    info = 0
     
  15. vlasenkov

    vlasenkov Новичок

    С нами с:
    21 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Спасибо всем за помощь, я смог это сделать.
    PHP:
    1. $user = 'username';
    2. $pass = 'password';
    3.  
    4.     $url = 'url';
    5.  
    6.     $ch = curl_init($url);
    7.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    8.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    9.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    10.     curl_setopt($ch, CURLOPT_USERPWD,"$user:$pass");
    11.     curl_setopt($ch, CURLOPT_HTTPGET, 1);
    12.  
    13.     $exec = curl_exec($ch);
    14.  
    15.     curl_close($ch);
    Скорее всего проблем была в том, что у хостера были закрыты некоторые порты, которые были необходимы.
    На будущее стоит уточнять этот момент.