Как исправить ошибку 401 Требуется аутентификация при использовании curl с HTTP-аутентификацией

Я использую локальный скрипт php, который запускает curl на скрипте на удаленном сервере. Удаленный скрипт защищен HTTP-аутентификацией.

Когда я запускаю свой локальный скрипт, я получаю следующую ошибку:

«Этот сервер не смог подтвердить, что вы авторизованы для доступа к URL-адресу« /script.php ». Либо вы ввели неправильные учетные данные (например, неверный пароль), либо ваш браузер не понимает, как предоставить необходимые учетные данные.

Если вам разрешено запросить документ, проверьте свой идентификатор пользователя и пароль и повторите попытку.

Если вы считаете, что это ошибка сервера, обратитесь к веб-мастеру.

Ошибка 401 "

Я пробовал ответы с наибольшим количеством голосов отсюда: Как мне сделать запрос, используя базовую аутентификацию HTTP с PHP curl? и я пробовал это: https://thisinterestsme.com/php-curl-http-auth/

-> Я всегда получаю одну и ту же ошибку сверху.

Я определил $username и $password. Код, который я использую:

$url = 'https://' . $page . '/script.php';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml', $additionalHeaders));
print_r($additionalHeaders);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadName);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$return = curl_exec($ch);
print_r($return);
curl_close($ch);

После печати переменной $additionalHeaders перед ошибкой я получаю следующую дополнительную информацию:

«HTTP / 1.1 401 Unauthorized Дата: Сб, 10 августа 2019 г., 22:05:26 GMT Сервер: Apache WWW-аутентификация: Digest realm =" Protected ", nonce =" Xg78fMqPBQA = 8d674639fbd19b9ec67b085aa43e90be7a4c57cc ", алгоритм =" MD5 ", q Vary: accept-language, accept-charset Strict-Transport-Security: max-age = 16000000 Обновление: h2 Подключение: Обновление Accept-Ranges: байты Кодирование передачи: фрагментированное Content-Type: text / html; charset = utf-8 Content -Язык: en "

Печать $return ничего не показывает ...


person codingforworlddomination    schedule 10.08.2019    source источник
comment
Попробуйте длинный способ аутентификации: stackoverflow.com/questions/2140419/ люди сообщают, что это работает только для них.   -  person paskl    schedule 11.08.2019
comment
ваш веб-сайт вообще не использует HTTP Basic Auth, он использует дайджест-аутентификацию доступа, google CURLAUTH_DIGEST , curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_DIGEST);   -  person hanshenrik    schedule 11.08.2019
comment
Спасибо за ответы @paskl и @hanshenrik! замена curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml', $additionalHeaders)); на curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); решила проблему!   -  person codingforworlddomination    schedule 11.08.2019


Ответы (2)


ваш веб-сайт вообще не использует HTTP Basic Auth, он использует дайджест-аутентификацию доступа, google CURLAUTH_DIGEST ,

curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_DIGEST);
person hanshenrik    schedule 11.08.2019
comment
Спасибо @hanshenrik, проблема решена! Я бы проголосовал за ваш ответ, но пока не могу, потому что у меня пока недостаточно репутации. - person codingforworlddomination; 11.08.2019

Полностью рабочее решение (кроме $url $username и $password) выглядит так:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadName);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$return = curl_exec($ch);
curl_close($ch);
person codingforworlddomination    schedule 11.08.2019