A autenticación proxy ten opcións cURL propias. Establecer CURLOPT_USERPWD para entrar nun sitio non configura a conta do proxy, e elixir CURLOPT_HTTPAUTH non escolle o método de autenticación proxy.

<?php
$user = 'proxy-user';
$password = getenv('PROXY_PASSWORD');
if ($password === false) {
    throw new RuntimeException('Set PROXY_PASSWORD');
}

$ch = curl_init('https://example.com/');
curl_setopt_array($ch, [
    CURLOPT_PROXY => 'http://203.0.113.10:8080',
    CURLOPT_NOPROXY => '',
    CURLOPT_PROXYUSERPWD =>
        rawurlencode($user) . ':' . rawurlencode($password),
    CURLOPT_PROXYAUTH => CURLAUTH_BASIC,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 15,
]);

$body = curl_exec($ch);
if ($body === false) {
    throw new RuntimeException(curl_error($ch), curl_errno($ch));
}
echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL;

Substitúe o IP documental e usa as credenciais facilitadas para ese proxy. Basic escolleuse intencionadamente no exemplo; usa o método compatible e aprobado para o servizo sen supoñer que todos os puntos o precisan.

O campo combinado ten unha regra de codificación

libcurl documenta que CURLOPT_PROXYUSERPWD descodifica como URL o usuario e o contrasinal. O exemplo codifica cada compoñente antes de unilos co delimitador. Isto importa se unha secuencia literal de porcentaxe ou outro carácter especial forma parte das credenciais.

As opcións separadas de usuario e contrasinal proxy aceptan directamente os valores:

curl_setopt($ch, CURLOPT_PROXYUSERNAME, $user);
curl_setopt($ch, CURLOPT_PROXYPASSWORD, $password);

Úsaas como forma alternativa antes de executar a solicitude. Non apliques automaticamente a regra de descodificación do campo proxy combinado a CURLOPT_USERPWD; libcurl documenta unha diferenza.

Mantén separados os tramos de autenticación

CURLOPT_PROXYAUTH escolle a autenticación proxy, mentres CURLOPT_HTTPAUTH escolle a autenticación HTTP co destino. Se ambos requiren login, configura as opcións de cada un en vez de copiar as mesmas credenciais nos dous lugares.

CURLAUTH_ANY permite negociar e pode engadir un intercambio desafío-resposta antes de escoller método. Non demostra que as credenciais sexan correctas. Engadir tamén manualmente unha cabeceira Proxy-Authorization pode interferir coa autenticación da biblioteca.

As credenciais Basic nunha conexión en texto claro ao proxy non están protexidas polo túnel TLS posterior do sitio. Comproba ese transporte por separado ao elixir como usar un servizo autenticado.

Artigos relacionados