web-dev-qa-db-ja.com

http 407プロキシ認証が必要:Javaコードでの処理方法

System.setProperty("http.proxySet", "true");
System.setProperty("Java.net.useSystemProxies", "true");
System.setProperty("http.proxyHost", "192.168.1.103");
System.setProperty("http.proxyPort", "3128");
System.setProperty("http.proxyUser", "user123");
System.setProperty("http.proxyPassword", "passwD123");

url = new URL("http://www.google.co.in");

このコードを使用するたびにIOExceptionがスローされ、HTTP応答コード407が返されます。HTTP407はプロキシ認証が必要であることを意味します。 proxyUserとproxyPasswordを設定しているときにこの問題が発生する理由。 enter image description here
間違ったパスワードを入力するとhttp 401が発生しますが、常に407が表示されます。これは、コードがユーザー名とパスワードを受け取らないことを意味します。上記のコードでは、user123はユーザー名で、passwD123はプロキシ認証のパスワードです。

12
dayitv89

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-Java.html

Vinod Singh氏に感謝します。

Javaでのプロキシ認証

通常の企業ネットワークは、プロキシサーバーを介したインターネットアクセスを提供し、時には認証も必要とします。アプリケーションが企業イントラネットの外部にあるサーバーへの接続を開く場合があります。そのため、プログラムでプロキシ認証を行う必要があります。幸いなことにJavaはプロキシ認証を行う透過的なメカニズムを提供します。

以下のような単純なクラスを作成します-

import Java.net.Authenticator;

class ProxyAuthenticator extends Authenticator {

    private String user, password;

    public ProxyAuthenticator(String user, String password) {
        this.user = user;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password.toCharArray());
    }
}

コードがURLConnection-を開く前にこれらのコード行を配置します

Authenticator.setDefault(new ProxyAuthenticator("user", "password"));
System.setProperty("http.proxyHost", "proxy Host");
System.setProperty("http.proxyPort", "port");

これで、すべての呼び出しがプロキシ認証を正常にパススルーします。

19
dayitv89

@GauravDSあなたは言及しました:

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-Java.html ソリューションはVinod Singh氏に感謝します。 Javaのプロキシ認証は、通常の企業ネットワークがプロキシサーバー経由でインターネットアクセスを提供し、認証も必要になる場合があります。幸いなことにJavaはプロキシ認証を行う透過的なメカニズムを提供します。以下のような単純なクラスを作成します。


そして、コードがURLConnection-を開く前にこれらのコード行を配置します-Authenticator.setDefault(new ProxyAuthenticator("user", "password")); System.setProperty("http.proxyHost", "proxy Host"); System.setProperty("http.proxyPort", "port");これで、すべての呼び出しがプロキシ認証を正常にパススルーします。

あなたが接続しているサイトがあなたを許可するためにユーザー名/パスワードも必要とする場合はどうでしょう。デフォルトのAuthenticator(Authenticator.setDefault)の設定は失敗します。外部サイトが認証されたユーザーを探すとき、私は推測します。

任意のビュー?....誰か?

Edit:1以前にこのコードを使用し、エラー(407)Proxy Authentication Requiredを取得していました。これは、認証が異なるホストから要求されたためだと思います。また、1人のホストに対して1人のユーザー/パスでデフォルトの認証システムを設定すると、他の要求ホストの認証は失敗します。昨日SimpleAuthenticatorクラスに次の変更を加えましたが、今ではそれが魅力のように機能します。

   protected PasswordAuthentication getPasswordAuthentication()
   {
    String requestingHost = getRequestingHost();
    if (requestingHost == proxyHost){
        System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost );
        return new PasswordAuthentication(proxyuser,proxypass.toCharArray());
    }
    else{
        System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost );
        return new PasswordAuthentication(sharepointusername,sharepointpassword.toCharArray());
    }

   }

詳細はこちら: http://blog.ashwani.co.in/blog/2013-07-29/access-sharepoint-webservices-from-Java-behind-proxy/

7
TheAshwaniK

Authenticatorを使用する答えは、一般的な場合に正しいです。ただし、 Java 8u111 以降のHTTP 407の別の原因は、プロキシに対してBASIC認証を使用している場合です。

この場合、次のシステムプロパティを追加します。

-Djdk.http.auth.tunneling.disabledSchemes=

私はこれを以下から見つけました: https://confluence.atlassian.com/kb/basic-authentication-fails-for-outgoing-proxy-in-Java-8u111-909643110.html

3
Dan Gravell