簡體   English   中英

使用 JDK 11 HttpClient 進行代理身份驗證

[英]Proxy Authentication with JDK 11 HttpClient

我正在嘗試使用 JDK 11 HttpClient通過公司代理發出請求,該代理需要通過登錄名和密碼進行身份驗證。 根據JDK的介紹,我正在通過以下方式構建客戶端實例:

HttpClient httpClient = HttpClient.newBuilder()
        .version(HTTP_1_1)
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.mycompany.com", 3128)))
        .authenticator(authenticator)
        .build();

,其中authenticator者是:

Authenticator authenticator = new Authenticator() {
  @Override
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication("login", "password".toCharArray());
  }
};

然后我自己執行請求:

HttpRequest outRequest = HttpRequest.newBuilder()
        .version(HTTP_1_1)
        .GET()
        .uri(URI.create("https://httpwg.org/asset/http.svg")) // no matter which URI to request
        .build();
HttpResponse<String> inResponse = httpClient.send(outRequest, BodyHandlers.ofString());

但不是來自目標服務器的有效響應( https://httpwg.org )我收到HTTP 407(需要代理身份驗證) ,即HttpClient不使用提供的authenticator器。

我嘗試了這里這里提到的各種解決方案,但沒有一個有幫助。

使它工作的正確方法是什么?

默認情況下,從 java 8u111 開始,當通過身份驗證代理進行隧道傳輸時,將禁用使用代理的基本身份驗證。

您可以通過在 java 命令行上指定-Djdk.http.auth.tunneling.disabledSchemes=""來重新啟用它。

請參閱jdk 8u111 發行說明

您必須在請求上設置“代理授權”標頭。

HttpClient httpClient = HttpClient.newBuilder()
        .version(HTTP_1_1)
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.mycompany.com", 3128)))
        .build();

String encoded = new String(Base64.getEncoder().encode("login:password".getBytes()));

HttpRequest outRequest = HttpRequest.newBuilder()
                                    .version(HTTP_1_1)
                                    .GET()
                                    .uri(URI.create("https://httpwg.org/asset/http.svg")) // no matter which URI to request
                                    .setHeader("Proxy-Authorization", "Basic " + encoded)
                                    .build();

利用

System.setProperty("jdk.http.auth.proxying.disabledSchemes", "");
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");

使用代理選擇器和身份驗證器構建您的 http 客戶端

HttpClient client = HttpClient.newBuilder()
    .authenticator(yourCustomAuthenticator)
    .proxy(yourCustomProxySelector)
    .build();

在您的身份驗證器覆蓋

@Override
protected PasswordAuthentication getPasswordAuthentication() {
    if (getRequestorType().equals(RequestorType.PROXY)) {
        return getPasswordAuthentication(getRequestingHost());
    } else {
        return null;
    }
}
protected PasswordAuthentication getPasswordAuthentication(String proxyHost) {
    // your logic to find username and password for proxyHost
    return new PasswordAuthentication(proxyUsername, proxyPassword.toCharArray());
    // or return null
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM