Рассмотрим здесь вариации с выполнением base auth. Как оказывается из опыта работы с некоторыми API, они не являются эквивалентными. И одна форма запроса может не работать, в то время как другая будет выполняться.
Задача следующая — получить содержимое по адресу $url, если страница защищена базовой авторизацией.
1 2 3 |
$url = 'http://example.com/'; $name = 'myUserBaseAuthName'; $pass = 'myUserBaseAuthPassword'; |
Классический вариант, когда base auth (или http auth) передают в заголовках запроса. В процессе требуется использовать base64 кодировку для парольной пары:
Base Auth через заголовки:
1 2 3 4 5 |
$auth = base64_encode("$name:$pass"); $context = stream_context_create([ "http" => [ "header" => "Authorization: Basic $auth" ] ]); $content = file_get_contents($url, false, $context); |
Или CURL вариант этого же кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$headers = array( 'Authorization: Basic '. base64_encode($name.':'.$pass) ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $content = curl_exec($ch); curl_close($ch); |
CURL также позволяет использовать специальную опцию, которую он самостоятельно преобразует в нужные заголовки:
1 |
curl_setopt($ch, CURLOPT_USERPWD, $name . ":" . $pass); |
Другой метод заключается в использовании URL, как носителя пары user-pass.
Base auth через URL
URL нужно заменить на следующую, используя спецификацию URL с передачей реквизитов:
1 |
$url = "http://$user:$pass@example.com/"; |
В этом случае не нужно формировать заголовок Authorization, и код сократится до совсем простого:
1 |
$content = file_get_contents($url); |