Pasikartojantis 407 ne visada reiškia, kad Java išsiuntė neteisingą slaptažodį. Etaloninė JDK realizacija paprastai išjungia Basic autentifikavimą HTTPS CONNECT tuneliams. Tarpinis serveris, siūlantis tik Basic, gali būti atmestas dar prieš autentifikavimo atgalinio iškvietimo funkcijai pateikiant prisijungimo duomenis.

Apribokite prisijungimo duomenų atgalinio iškvietimo taikymo sritį

Priskirkite Authenticator Java HTTP klientui ir apribokite jį sukonfigūruotu tarpiniu serveriu:

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

Tai kliento nustatymo kodas, o ne visuotinis numatytasis autentifikatorius. Pakeiskite dokumentacijai skirtą adresą ir naudokite šiai paslaugai iš tiesų suteiktus prisijungimo duomenis. Užklausos teikėjo tipo ir galinio taško patikros neleidžia tai pačiai funkcijai neapdairiai pateikti tarpinio serverio paskyros duomenų atsakant į svetainės autentifikavimo reikalavimą.

Patikrinkite, kuriame autentifikavimo etape kyla klaida

JDK turi atskirus išjungtų autentifikavimo schemų nustatymus įprastam HTTP perdavimui per tarpinį serverį ir CONNECT tuneliams. Jų pavadinimai yra jdk.http.auth.proxying.disabledSchemes ir jdk.http.auth.tunneling.disabledSchemes.

Tai paaiškina, kodėl HTTP srauto autentifikavimas gali pavykti, o HTTPS tunelis per tą patį tarpinį serverį – ne. Patikrinkite vykdymo aplinkos conf/net.properties ir diegimo politiką, užuot manę, kad kitame kompiuteryje galioja tos pačios numatytosios reikšmės.

Visuotinai ištuštinti išjungtų schemų sąrašą nėra universalus tarpinio serverio taisymo būdas. Į nešifruotą HTTP tarpinį serverį siunčiamų Basic prisijungimo duomenų neapsaugo vėlesnis TLS ryšys su paskirties serveriu. Prieš patvirtindami pakeitimą peržiūrėkite tarpinio serverio transportą, autentifikavimo metodą ir diegimo politiką.

Dokumentuotas integruotas JDK autentifikavimo veikimas taip pat negarantuoja visų tarpinio serverio skelbiamų schemų palaikymo. Rankiniu būdu pateikta Authorization arba Proxy-Authorization antraštė pakeičia automatinio autentifikatoriaus eigą, todėl, funkcijai veikiant kitaip nei pavyzdyje, patikrinkite pasirinktines antraštes.

Susiję straipsniai