Gjentatte 407 betyr ikke alltid at Java sendte feil passord. Referanseimplementasjonen av JDK deaktiverer vanligvis Basic-autentisering for HTTPS-CONNECT-tunneler. En proxy som bare tilbyr Basic, kan bli avvist før autentiseringstilbakekallet ditt leverer påloggingsdata.

Avgrens virkeområdet til tilbakekallet for påloggingsdata

Knytt en Authenticator til Java-HTTP-klienten og avgrens den til den konfigurerte proxyen:

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();

Dette er oppsettskode for én klient, ikke en global standardautentiserer. Bytt ut dokumentasjonsadressen og bruk påloggingsdata som faktisk er oppgitt for tjenesten. Kontrollene av forespørrertype og endepunkt hindrer at det samme tilbakekallet tankeløst tilbyr proxykontoen ved en autentiseringsutfordring fra et nettsted.

Sjekk hvilket autentiseringstrinn som feiler

JDK har separate innstillinger for deaktiverte autentiseringsordninger ved vanlig HTTP-proxytrafikk og ved CONNECT-tunneler. De aktuelle navnene er jdk.http.auth.proxying.disabledSchemes og jdk.http.auth.tunneling.disabledSchemes.

Dette forklarer hvorfor HTTP-trafikk kan autentiseres mens en HTTPS-tunnel gjennom samme proxy feiler. Sjekk kjøremiljøets conf/net.properties og utrullingspolicyen i stedet for å anta at en annen maskin har de samme effektive standardverdiene.

Å tømme en liste over deaktiverte ordninger globalt er ingen generell proxyløsning. Basic-påloggingsdata sendt til en HTTP-proxy i klartekst beskyttes ikke av den senere TLS-forbindelsen til målet. Vurder proxytransporten, autentiseringsmetoden og utrullingspolicyen før du godkjenner en endring.

JDKs dokumenterte innebygde autentiseringsatferd lover heller ikke støtte for hver ordning en proxy annonserer. En manuelt oppgitt Authorization- eller Proxy-Authorization-header endrer den automatiske autentiseringsflyten, så se etter egendefinerte headere når tilbakekallet oppfører seg annerledes enn i eksemplet.

Relaterte artikler