Opakovaný 407 nemusí znamenat, že Java poslala nesprávné heslo. Referenční implementace JDK běžně zakazuje Basic autentizaci pro tunelování HTTPS CONNECT. Proxy nabízející jen Basic může být odmítnuta ještě před dodáním údajů vaším autentizačním callbackem.

Omezte působnost callbacku pro přihlašovací údaje

Připojte Authenticator k HTTP klientovi Javy a omezte jej na nastavenou proxy:

String proxyHost = "203.0.113.10";
int proxyPort = 8080;
String password = System.getenv("PROXY_PASSWORD");
if (password == null) {
    throw new IllegalStateException("Set PROXY_PASSWORD");
}

java.net.Authenticator auth = new java.net.Authenticator() {
    @Override
    protected java.net.PasswordAuthentication getPasswordAuthentication() {
        if (getRequestorType() == RequestorType.PROXY
                && proxyHost.equals(getRequestingHost())
                && proxyPort == getRequestingPort()) {
            return new java.net.PasswordAuthentication(
                "proxy-user", password.toCharArray());
        }
        return null;
    }
};

java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
    .proxy(java.net.ProxySelector.of(
        new java.net.InetSocketAddress(proxyHost, proxyPort)))
    .authenticator(auth)
    .connectTimeout(java.time.Duration.ofSeconds(5))
    .build();

Jde o nastavení konkrétního klienta, ne globální výchozí autentizátor. Nahraďte dokumentační adresu a použijte údaje skutečně dodané pro danou službu. Kontroly typu žadatele a koncového bodu brání tomu, aby stejný callback lehkovážně nabídl účet proxy při autentizační výzvě webu.

Zjistěte, která fáze autentizace selhává

JDK má oddělená nastavení zakázaných schémat pro běžné HTTP proxy a tunely CONNECT. Jmenují se jdk.http.auth.proxying.disabledSchemes a jdk.http.auth.tunneling.disabledSchemes.

Proto může HTTP provoz projít autentizací, zatímco HTTPS tunel přes stejnou proxy selže. Ověřte conf/net.properties používaného běhového prostředí a pravidla nasazení místo předpokladu, že jiný počítač má stejná účinná výchozí nastavení.

Globální vyprázdnění seznamu zakázaných schémat není univerzální opravou proxy. Údaje Basic poslané nešifrované HTTP proxy nechrání pozdější TLS spojení s cílem. Před schválením změny posuďte transport proxy, autentizační metodu a pravidla nasazení.

Dokumentované vestavěné autentizační chování JDK také neslibuje podporu každého schématu inzerovaného proxy. Ručně dodaná hlavička Authorization nebo Proxy-Authorization mění tok automatického autentizátoru; pokud se callback chová jinak než příklad, zkontrolujte vlastní hlavičky.

Související články