Разбор ошибки · 1 мин чтения

HTTP 407 Proxy Authentication Required: как исправить

407 возвращает сам прокси, а не сайт: он требует учётные данные, которых не получил. Объясняем, что именно вызывает эту ошибку, и разбираем исправления для curl, браузеров, Python, Windows и корпоративных прокси.

Что на самом деле значит 407

HTTP 407 Proxy Authentication Required приходит от прокси, а не от сайта назначения. Это способ прокси сказать: «Я перешлю твой запрос, но сначала докажи, кто ты». На уровне прокси это близнец 401: в ответе есть заголовок Proxy-Authenticate со схемой, которую прокси хочет (обычно Basic), а клиент должен повторить запрос с заголовком Proxy-Authorization. Если учётных данных нет, они поломаны или неверны — вы получаете 407.

С аутентифицированными прокси вроде s4m — SOCKS5 на 1080, HTTP на 3128, оба с USER:PASS — 407 почти всегда означает одно из четырёх: учётные данные не переданы, переданы неверные, в пароле есть спецсимволы, сломавшие разбор URL, или инструмент, которым вы пользуетесь, читает учётные данные не там, куда вы их положили (классика для Puppeteer и Scrapy). Ниже исправления от самого частого к самому редкому. Контекст — в руководстве по аутентификации прокси и в обзоре прокси.

Правильные учётные данные — для каждого инструмента

Те же USER:PASS, но в том месте, откуда их реально читает каждый инструмент. Подставьте свои учётные данные.

bash
# curl: inline in URL, or with -U (URL-encode special chars, e.g. @ -> %40)
curl -x http://USER:[email protected]:3128 https://api.ipify.org
curl -x proxy.s4m.online:3128 -U USER:PASS https://api.ipify.org

# wget: dedicated flags
wget -e https_proxy=proxy.s4m.online:3128 \
     --proxy-user=USER --proxy-password=PASS https://example.com

# Python requests: credentials belong in the proxy URL
#   proxies = {"http": "http://USER:[email protected]:3128",
#              "https": "http://USER:[email protected]:3128"}
#   requests.get(url, proxies=proxies)

# Environment variables (many tools read these):
export HTTPS_PROXY="http://USER:[email protected]:3128"

# Special characters? URL-encode the password:
#   pa@ss  ->  pa%40ss     (Python: urllib.parse.quote(pw, safe=''))

# Verify it worked: a 200 with an IP body means auth passed.
curl -o /dev/null -s -w "%{http_code}\n" \
     -x http://USER:[email protected]:3128 https://api.ipify.org

Чиним 407 шаг за шагом

Идите по списку сверху вниз; большинство 407 закрывается на шаге 3.

Убедитесь, что прокси требует аутентификации

Прокси s4m требуют USER:PASS. 407 означает, что прокси не получил действительных учётных данных, — так что вопрос только в том, где ваши теряются, а не нужна ли аутентификация вообще.

Проверьте учётные данные до символа

Скопируйте USER и PASS из панели заново. Лишний пробел в конце, одна не та буква или просроченный доступ — всё это даёт 407. Сначала проверьте их одной командой curl -x.

Кодируйте спецсимволы в URL

Если в пароле есть @, :, /, # или подобное — закодируйте их (@ становится %40). Без кодирования они ломают URL прокси, и клиент отправляет неверные или обрезанные учётные данные.

Кладите учётные данные туда, откуда их читает инструмент

Часть инструментов игнорирует учётные данные в URL: Puppeteer требует page.authenticate(), Scrapy — заголовка Proxy-Authorization. Подбирайте способ под инструмент, а не только под прокси.

Браузеры, Windows и корпоративные прокси

В браузере 407 обычно выглядит как всплывающее окно входа от прокси; правильные имя пользователя и пароль его закрывают. Когда браузер автоматизирован, именно это окно и есть проблема — headless Chromium нечем на него ответить. Поэтому Puppeteer использует page.authenticate(), Playwright принимает учётные данные в своём объекте прокси, а Selenium требует небольшого расширения. В Windows проверьте системный прокси в настройках и прокси отдельных приложений: устаревшее сохранённое там значение даёт 407 в инструментах, которые наследуют системный прокси.

Корпоративные прокси добавляют нюанс: некоторые используют NTLM или Kerberos вместо Basic, поэтому обычного USER:PASS мало — нужен режим NTLM в вашем инструменте. Сам s4m работает на стандартном Basic USER:PASS, так что с нашими эндпоинтами NTLM не понадобится. Если учётные данные точно верны, а 407 не уходит, проверьте порт (1080 SOCKS5, 3128 HTTP) и проверьте эндпоинт через инструменты. Родственную ошибку Chrome разбирает руководство по ERR_PROXY_CONNECTION_FAILED.

FAQ

Ответы на вопросы

Ошибка 407 — это вина сайта или прокси?

Прокси. HTTP 407 Proxy Authentication Required возвращает именно прокси, а не сайт назначения: он сообщает, что ему нужны действительные учётные данные, прежде чем он перешлёт запрос. До сайта дело вообще не доходит, пока вы не аутентифицируетесь.

Почему 407 появляется даже с правильным паролем?

Чаще всего в пароле есть спецсимволы, которые ломают URL прокси, и клиент отправляет не то значение. Закодируйте их для URL (например, @ становится %40). Ещё проверьте, что инструмент читает учётные данные именно оттуда, куда вы их положили.

Как починить 407 в Puppeteer, Playwright или Selenium?

Браузеры игнорируют учётные данные во флаге прокси. В Puppeteer используйте page.authenticate(), в Playwright — поля username/password объекта прокси, в Selenium — небольшое расширение с учётными данными.

Использует ли s4m аутентификацию NTLM?

Нет. s4m использует стандартную аутентификацию Basic USER:PASS на портах 1080 (SOCKS5) и 3128 (HTTP). NTLM касается только некоторых корпоративных прокси, а не наших эндпоинтов.

Прокси с простой аутентификацией

Прокси s4m работают на обычном USER:PASS на proxy.s4m.online — без NTLM и без сюрпризов. SOCKS5 и HTTP дата-центра с оплатой за трафик, а для доступа по белому списку есть выделенный IP.

Эту страницу нашли по запросу

Реальные поисковые фразы, на которые отвечает эта страница — по ссылкам откроются материалы, раскрывающие тему глубже.