Повторен 407 не значи секогаш дека Java испратила погрешна лозинка. Референтната имплементација на JDK обично ја исклучува Basic автентикацијата за HTTPS CONNECT тунели. Прокси што нуди само Basic може да биде одбиено пред вашиот повратен повик за автентикација да достави акредитиви.

Ограничете го опсегот на повратниот повик за акредитиви

Поврзете Authenticator со Java HTTP клиентот и ограничете го на конфигурираното прокси:

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

Ова е код за поставување еден клиент, а не глобален стандарден автентикатор. Заменете ја документациската адреса и користете акредитиви што навистина се дадени за таа услуга. Проверките на типот на барателот и крајната точка спречуваат истиот повратен повик непромислено да ја понуди прокси-сметката при барање за автентикација од веб-сајт.

Проверете која фаза на автентикацијата не успева

JDK има посебни поставки за исклучени шеми за обичен HTTP сообраќај преку прокси и за CONNECT тунели. Соодветните имиња се jdk.http.auth.proxying.disabledSchemes и jdk.http.auth.tunneling.disabledSchemes.

Тоа објаснува зошто HTTP сообраќајот може да се автентицира, додека HTTPS тунел преку истото прокси не успева. Проверете ги conf/net.properties на извршната околина и политиката за распоредување, наместо да претпоставувате дека на друга машина важат истите стандардни вредности.

Глобалното празнење на списокот со исклучени шеми не е општа поправка за прокси. Basic акредитивите испратени до нешифрирано HTTP прокси не се заштитени од подоцнежната TLS врска со одредиштето. Пред да одобрите промена, разгледајте ги транспортот до проксито, методот на автентикација и политиката за распоредување.

Документираното однесување на вградената JDK автентикација исто така не ветува поддршка за секоја шема што ја огласува проксито. Рачно зададено заглавие Authorization или Proxy-Authorization го менува текот на автоматскиот автентикатор, па проверете ги приспособените заглавија кога повратниот повик се однесува различно од примерот.

Поврзани статии