Question

Je construis un plugin Eclipse qui parle à une interface REST qui utilise l'authentification de base. Lorsque l'authentification échoue, je voudrais au popup boîte de dialogue de mon plugin paramètres et réessayez. Normalement, je pouvais utiliser le Authenticator.setDefault() statique pour configurer un authentificateur pour tous HttpURLConnection est pour cela, mais depuis que je suis en train d'écrire un plugin Je ne veux pas remplacer le Authenticator par défaut (org.eclipse.ui.internal.net.auth) Eclipse;

Je pensais à ma mise en Authenticator personnalisée avant le chargement et la mise par défaut d'Eclipse retour plus tard, mais j'imagine que cela va causer toutes sortes de problèmes de course avec multithreading donc j'ai perdu rapidement cette notion.

recherches Google cédons toutes sortes de résultats me dire, fondamentalement, il est impossible:

  

L'API Java URLConnection doit avoir une méthode setAuthenticator (Authenticator) pour le rendre plus facile à utiliser cette classe dans un contexte multi-thread où l'authentification est nécessaire.

Source

  

Si des applications contient quelques plugins tiers et chaque plugin utiliser son propre Authenticator ce que nous devrions faire? Chaque appel de la méthode "Authenticator.setDefault ()" ré-écriture Authenticator défini précédemment ...

Source

Y a-t-il des approches différentes qui pourraient me aider à résoudre ce problème?

Était-ce utile?

La solution

S'il est impossible avec HttpURLConnection je suggère d'utiliser la bibliothèque httpclient de Apache.

Un exemple rapide:

HttpClient client = new HttpClient();
client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("test","test"));
GetMethod getMethod = new GetMethod("http://www.example.com/mylogin");
client.executeMethod(getMethod);
System.out.println(getMethod.getResponseBodyAsString());

Autres conseils

Une autre approche serait d'effectuer l'authentification de base vous-même sur la connexion.

    final byte[] encodedBytes = Base64.encodeData((username + ':' + new String(password)).getBytes("iso-8859-1"));
    final String encoded = new String(encodedBytes, "iso-8859-1");

    connection.setRequestProperty("Authorization", "Basic " + encoded);

Cela aurait aussi l'avantage de ne pas nécessiter une demande non authentifié de recevoir un 401 avant de fournir les informations d'identification sur une demande ultérieure. Un comportement similaire peut être mise à profit dans le http-client apache en demandant l'authentification préemptive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top