Réponse rapide
Que signifie 407 Proxy Authentication Required avec un proxy ?
407 Proxy Authentication Required signifie que le proxy a refusé votre requête car il n'a reçu aucun identifiant ou des identifiants incorrects. Le site cible n'a jamais été contacté. Avec les proxies résidentiels CrawlRelay, vérifiez trois points : que le nom d'utilisateur est celui affiché dans votre tableau de bord, que le mot de passe correspond, et que tout caractère spécial dans l'un ou l'autre est encodé en URL. Retenter la même requête ne corrige jamais une 407.
407 Proxy Authentication Required en un coup d'œil
| Erreur | 407 Proxy Authentication Required |
|---|---|
| Type | Code d'état HTTP (4xx, erreur client) |
| Envoyé par | La passerelle proxy, jamais le site cible |
| Défini dans | RFC 9110, section 15.5.8 (headers: Proxy-Authenticate 11.7.1, Proxy-Authorization 11.7.2) |
| Réessayer ? | Non. Les mêmes identifiants échouent à nouveau ; corrigez-les d'abord |
| Vérification initiale | Exécutez le test curl ci-dessous avec uniquement le nom d'utilisateur et sans paramètres de ciblage |
Que signifie 407 Proxy Authentication Required ?
Une 407 provient du proxy, pas du site que vous souhaitez atteindre. La RFC 9110 la décrit comme la version proxy du 401 : le client doit s'authentifier auprès du proxy avant toute autre action. Le proxy envoie un en-tête Proxy-Authenticate indiquant le schéma accepté, presque toujours Basic. Votre client répond avec un en-tête Proxy-Authorization qui porte username:password encodé en Base64.
Pour une cible HTTPS, la 407 arrive en réponse à la requête CONNECT qui ouvre le tunnel. C’est pourquoi de nombreuses bibliothèques la rapportent comme une erreur de tunnel ou de connexion et non comme un statut HTTP : la session TLS avec le site n’a jamais commencé.
À quoi ressemble a 407 en Python, curl, Node.js et navigateurs ?
La même erreur s'affiche différemment selon chaque outil. Voici les messages à rechercher dans vos logs :
- Python requests :
ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 407 Proxy Authentication Required')) - curl :
curl: (56) CONNECT tunnel failed, response 407 - Scrapy :
TunnelError: Could not open CONNECT tunnel with proxy ... [{'status': 407, 'reason': b'Proxy Authentication Required'}] - Chrome, Playwright, Puppeteer :
net::ERR_TUNNEL_CONNECTION_FAILED, ou une fenêtre de connexion dans un navigateur visible - Clients Node.js sur une cible http:// :
Request failed with status code 407
Quelles sont les causes de a 407 ?
Probablement en premier lieu :
- Nom d'utilisateur ou mot de passe incorrect. Une faute de frappe, un ancien mot de passe après réinitialisation, ou les identifiants d'un autre sous-utilisateur.
- Caractères spéciaux non encodés. Un mot de passe contenant
@,:,/ou#casse l’URLuser:pass@host. Encodez-le en pourcentage :@devient%40,:devient%3A. - Suffixe de ciblage erroné. Les passerelles qui lisent le ciblage depuis le nom d’utilisateur voient un nom trop long. Une faute dans une clé ou un code pays le transforme en un nom que le proxy ne connaît pas.
- Identifiants qui ne quittent jamais votre code. Chrome ignore un nom d’utilisateur et mot de passe écrits dans
--proxy-server. Puppeteer nécessitepage.authenticate(), et Selenium un forwarder local. - Solde vide. Vérifiez que votre compte a encore du trafic avant de déboguer votre code.
Comment diagnostiquer a 407 étape par étape ?
- Testez les identifiants avec curl sans ciblage du tout (commande ci-dessous). Une ligne
HTTP/1.1 407dans la sortie verbose confirme un problème d’identifiants. - Rajoutez vos paramètres de ciblage un par un, en relançant le test à chaque fois.
- Enregistrez l’URL proxy que votre programme construit réellement, avec le mot de passe masqué, et comparez-la caractère par caractère au tableau de bord.
- Si curl réussit et que votre programme échoue, la bibliothèque n’envoie pas les identifiants. Lisez la solution pour votre outil ci-dessous.
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLComment résoudre a 407 ?
- Encodez les identifiants avec
urllib.parse.quote(value, safe='')en Python ouencodeURIComponent()en JavaScript avant de construire l’URL. - Navigateurs : passez
usernameetpassworddans l’optionproxyde Playwright, appelezpage.authenticate()dans Puppeteer, et utilisez un forwarder local pour Selenium. Voir les guides Playwright et Puppeteer. - Variables d’environnement : si vous réglez
HTTPS_PROXY, quotez toute la valeur dans votre shell afin que@et$soient conservés. - Changez le mot de passe dans le tableau de bord si vous suspectez une fuite, puis mettez à jour chaque scraper qui l’utilise.
from urllib.parse import quote
import requests
user = "USERNAME-country-us"
password = "p@ss:word/1" # example containing special characters
# safe="" also encodes "/", "@" and ":" inside the credentials
proxy = "http://{}:{}@gw.crawlrelay.com:7777".format(
quote(user, safe=""), quote(password, safe="")
)
proxies = {"http": proxy, "https": proxy} # http:// for both keys
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=(10, 30))
print(r.status_code, r.text)from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gw.crawlrelay.com:7777",
"username": "USERNAME-country-us",
"password": "PASSWORD",
})
page = browser.new_page()
response = page.goto("https://api.ipify.org")
print(response.status, page.inner_text("body"))
browser.close()Dois-je réessayer après a 407 ?
Ne retentez pas une 407 automatiquement. Une nouvelle tentative avec les mêmes identifiants renvoie la même réponse, et une boucle serrée ne fait que remplir vos logs. Considérez la 407 comme une erreur de configuration : stoppez la tâche, corrigez les identifiants, et relancez. Si une 407 survient soudainement dans une tâche fonctionnant depuis plusieurs jours, le mot de passe a probablement été changé ou le sous-utilisateur désactivé.
Quelle est l'incidence de 407 Proxy Authentication Required sur CrawlRelay ?
La passerelle CrawlRelay lit le nom d’utilisateur et le mot de passe à chaque nouvelle connexion. Le ciblage et les paramètres de session résident dans le nom d’utilisateur, donc un mot de passe valide peut quand même échouer si le suffixe est mal formé. Construisez le nom d’utilisateur dans une fonction dédiée et enregistrez sa sortie une fois au démarrage. La page de démarrage rapide montre le format exact.
Passerelle : gw.crawlrelay.com, port 7777 (HTTP, HTTPS via CONNECT) et port 7778 (SOCKS5). Format du nom d'utilisateur : USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Voir aussi : 401 vs 407 · ERR_TUNNEL_CONNECTION_FAILED · Impossible de se connecter au proxy.
407 Proxy Authentication Required : questions fréquentes des développeurs
Une 407 est-elle envoyée par le site que je scrape ?
Non. Une 407 est toujours envoyée par un proxy situé entre vous et le site web. La requête n’a jamais atteint le site, il ne peut donc ni voir votre trafic, ni le compter, ni vous bloquer à cause de lui. Si le site voulait un login, il répondrait 401 à la place. Corrigez les identifiants du proxy et la 407 disparaît.
Pourquoi mon code reçoit-il une 407 alors que curl fonctionne avec le même proxy ?
Votre bibliothèque n’envoie pas les identifiants, ou les envoie sous une forme différente. Les causes habituelles sont les identifiants tapés dans un flag du navigateur qui les ignore, une variable d’environnement qui a perdu ses caractères spéciaux, ou un mot de passe non encodé en URL. Affichez l’URL proxy construite par votre code, avec le mot de passe masqué, et comparez-la à la commande curl.
Une 407 consomme-t-elle du trafic de mon forfait ?
Une réponse 407 fait quelques centaines d’octets et la requête n’atteint jamais la cible, donc aucune page n’est téléchargée. Le coût est ailleurs : un scraper coincé dans une boucle de retry 407 gaspille du temps et remplit vos logs. Faites d’une 407 un arrêt franc dans votre gestion d’erreur.
Autres erreurs de proxy dans cette référence
Codes d'état HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Erreurs du navigateur et du client
Erreurs de connexion et TLS
Proxies résidentiels avec documentation couvrant les cas de défaillance
Proxies résidentiels CrawlRelay de 0,50 $US/GB, trafic sans expiration.