web-dev-qa-db-fra.com

Authentification proxy http 407 requise: comment gérer en 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");

chaque fois que j'utilise ce code, IOException lance ce qui dit code de réponse HTTP 407. HTTP 407 signifie une authentification proxy requise. pourquoi ce problème vient alors que je définis proxyUser et proxyPassword. enter image description here
http 401 se produira si je mets un mauvais mot de passe mais il me donne toujours 407, signifie que mon code ne prend pas le nom d'utilisateur et le mot de passe. Dans le code ci-dessus, user123 est le nom d'utilisateur et passwD123 est le mot de passe pour l'authentification proxy.

13
dayitv89

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

J'ai trouvé la solution grâce à M. Vinod Singh.

Authentification proxy en Java

Les réseaux d'entreprise habituels fournissent un accès Internet via des serveurs proxy et nécessitent parfois une authentification également. Les applications peuvent-elles ouvrir les connexions aux serveurs externes à l'intranet de l'entreprise. Il faut donc faire l'authentification proxy par programmation. Heureusement Java fournit un mécanisme transparent pour faire des authentifications proxy.

Créez une classe simple comme ci-dessous-

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

et mettez ces lignes de code avant que votre code n'ouvre un URLConnection-

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

Désormais, tous les appels passent avec succès l'authentification proxy.

20
dayitv89

@GauravDS Vous avez mentionné:

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-Java.html J'ai trouvé la solution grâce à M. Vinod Singh. Authentification proxy en Java Les réseaux d'entreprise habituels fournissent un accès Internet via des serveurs proxy et parfois ils nécessitent également une authentification. Les applications peuvent ouvrir les connexions aux serveurs externes à l'intranet de l'entreprise. doit faire l'authentification proxy par programmation. Heureusement Java fournit un mécanisme transparent pour faire des authentifications proxy. Créez une classe simple comme ci-dessous-.
.
.
et placez ces lignes de code avant que votre code n'ouvre une URLConnection- Authenticator.setDefault(new ProxyAuthenticator("user", "password")); System.setProperty("http.proxyHost", "proxy Host"); System.setProperty("http.proxyPort", "port"); Maintenant, tous les appels passeront avec succès via l'authentification proxy.

Que faire si le site auquel vous vous connectez nécessite également un nom d'utilisateur/mot de passe pour vous permettre. La définition d'un authentificateur par défaut (Authenticator.setDefault) échouera, je suppose, lorsque le site externe recherchera un utilisateur authentifié.

Des vues? .... Quelqu'un?

Edit: 1 A utilisé ce code plus tôt et obtenait l'erreur (407) Authentification proxy requise. Je pense que c'est parce que l'authentification a été demandée par différents hôtes. et lorsque vous définissez un authentificateur par défaut avec un utilisateur/passe pour un hôte, l'authentification échouera pour l'autre hôte demandeur. Hier, j'ai apporté la modification suivante à la classe SimpleAuthenticator et maintenant cela fonctionne comme un charme.

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

   }

Plus d'informations ici: http://blog.ashwani.co.in/blog/2013-07-29/access-sharepoint-webservices-from-Java-behind-proxy/

7
TheAshwaniK

La réponse pour utiliser un Authenticator est correcte pour le cas général. Cependant, une autre cause de HTTP 407 dans Java 8u111 et versions ultérieures est si vous utilisez l'authentification BASIC contre le proxy.

Dans ce cas, ajoutez cette propriété système:

-Djdk.http.auth.tunneling.disabledSchemes=

J'ai découvert cela sur: https://confluence.atlassian.com/kb/basic-authentication-fails-for-outgoing-proxy-in-Java-8u111-909643110.html

5
Dan Gravell