another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как через скрипт отправить данные для авторизации по HTTP Basic Authorization?

Нужно посредством PHP скрипта произвести авторизацию на сервере по HTTP Basic Authorization.
На данный момент нашел только вот что:
<?
//выделяем переменные, просто для удобства;
$login = 'login';
$pass = 'password';
$url  = 'url';
$path = '/';
//устанавливаем соединение с сервером;
$sock  = @fsockopen($url, 80, $errno, $errstr, 30);
	if (!$sock) exit("Не смог соединиться");
    $lenght  = strlen($data);  //длина данных;
    $auth =  base64_encode("{$user}:{$pass}"); //данные для аутентификации;
    $request = <<<request
POST http://{$url} HTTP/1.0
Host:{$url}
Authorization: Basic {$auth}
Content-Type:text/xml
Content-length: {$lenght}
request;
    $request .= $data;
    $answ = '';
    if(fwrite($sock,$request))
        while(!feof($sock))
            $answ.= fgets($sock);
    fclose($sock);
header("Content-type: text/plain");
print($answ);
?>

Он работает не корректно, возвращает мне вот что:

HTTP/1.1 408 Request Time-out
Date: Fri, 13 Dec 2013 22:40:08 GMT
Server: Apache/2.2.16 (Debian)
Vary: Accept-Encoding
Content-Length: 306
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>408 Request Time-out</title>
</head><body>
<h1>Request Time-out</h1>
<p>Server timeout waiting for the HTTP request from the client.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at servername.ru Port 80</address>
</body></html>


Может кто направит куда пойти, что бы почитать? Или что поправить в скрипте? Уже около часа бьюсь и никак не могу прийти к решению. Или покажите пример скрипта, с комментариями, если вас не затруднит. Заранее спасибо.
P.S: Сильно не бейте за тупые вопросы.
  • Вопрос задан
  • 13344 просмотра
Решения вопроса 2
ScorpLeX
@ScorpLeX
curl --user name:password www.example.com
www.php.net/manual/en/book.curl.php

$curl = curl_init('http://www.example.com');
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "name:password");
curl_exec($curl);
Ответ написан
Комментировать
@Nc_Soft
Вот через сокет (это если вдруг курла нет)
$fp = @fsockopen("tcp://".$host, 80, $errno, $errstr, 10);
if (!$fp)
{
    die($errstr.':'.$errno);
}
else
{
    $out  = "GET $path HTTP/1.0\r\n";
    $out .= "Host: $host\r\n";
    //авторизируемся
    $out .= "Authorization: Basic " . base64_encode("$user:$password") . "\r\n";
    $out .= "Connection: Close\r\n\r\n";
    //посылаем данные
    fwrite($fp, $out.$data);
    $headers='';
    //читаем заголовки
    while ($str = trim(fgets($fp, 10000)))
    $headers .= "$str\n";
    $body='';
 
    //читаем ответ
    while (!feof($fp))
    $body.= fgets($fp, 10000);
 
    //закрываем сокет
    fclose($fp);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
username:password@host[:port][path]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы