HttpClientBuilder basic auth
Depuis HttpClient 4.3, j'ai été en utilisant le HttpClientBuilder. Je suis de la connexion à un service REST qui a l'authentification de base. Je suis en train de les informations d'identification comme suit:
HttpClientBuilder builder = HttpClientBuilder.create();
//Get the client credentials
String username = Config.get(Constants.CONFIG_USERNAME);
String password = Config.get(Constants.CONFIG_PASSWORD);
//If username and password was found, inject the credentials
if (username != null && password != null)
{
CredentialsProvider provider = new BasicCredentialsProvider();
//Create the authentication scope
AuthScope scope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM);
//Create credential pair
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password);
//Inject the credentials
provider.setCredentials(scope, credentials);
//Set the default credentials provider
builder.setDefaultCredentialsProvider(provider);
}
Toutefois, cela ne fonctionne pas (le RESTE du service que j'utilise est de retour 401). Ce qui ne va pas?
Vous devez vous connecter pour publier un commentaire.
De la de Préemption Authentification Documentation ici:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html
Par défaut, httpclient ne sera pas fournir des informations d'identification de manière préventive, il va d'abord créer une requête HTTP sans les paramètres d'authentification. C'est par la conception, par principe de précaution, et dans le cadre de la spécification. Mais, ce qui provoque des problèmes si vous n'avez pas de nouvelle tentative de connexion, ou partout où vous êtes connecté au compte sur vous pour envoyer les informations d'authentification lors de la première connexion. Elle provoque également une latence supplémentaire à une demande, que vous avez besoin de faire plusieurs appels, et les causes 401s à apparaître dans les journaux.
La solution de contournement consiste à utiliser une authentification cache de prétendre que vous avez déjà connecté au serveur une fois. Cela signifie que vous n'aurez qu'à faire un appel HTTP et de ne pas voir un 401 dans les journaux:
Veuillez noter: Vous avez besoin de faire confiance à l'hôte auquel vous vous connectez, et si vous êtes en utilisant HTTP, votre nom d'utilisateur et mot de passe sont envoyés en clair (bien, base64, mais ça ne compte pas).
Vous devez également être à l'aide d'une beaucoup plus spécifique Authscope plutôt que de compter sur
AuthScope .ANY_HOST
etAuthScope.ANY_PORT
comme dans votre exemple.En fait, puisque vous avez déjà confiance au serveur, il est probablement plus facile de simplement construire l'en-tête d'autorisation de vous-même.
C'est juste un de ces cas ont été il est plus facile de lire le spec, et de les rouler et de vous-même.
J'ai juste essayé votre code échantillon (contre un simple Basic Auth activé l'URL) et il fonctionne très bien - c'est le journal de l'
HttpClient
- un peu simplifié pour des raisons de concision:Donc, - il suffit de mettre:
- le Serveur ne contester la demande initiale
-
HttpClient
reconnaît le Basic Auth régime et répond à ce défi correctement- à ce stade, le Serveur de serveurs attendus
200 OK
Il peut être le cas que le RESTE du Service que vous utilisez n'est pas réellement à l'aide de l'Authentification de Base. Vous pouvez essayer de coller le plein
HttpClient
journaux afin de mieux diagnostiquer le problème.Espère que ça aide.
Je pense que HttpClient est comme les autres curl en fonction de la solution, il suit la spécification.
Et le spec est "Ne pas envoyer les informations d'identification, sauf si le serveur vous dire de le faire".
Ainsi, vous obtenez un 401 ("je veux u pour envoyer des informations d'identification")...
C'est un soap ui problème: quand vous ne savez pas, c'est pas évident