web-dev-qa-db-fra.com

Le serveur a renvoyé le code de réponse HTTP: 401 pour l'URL: https

J'utilise Java pour accéder à un site HTTPS qui renvoie l'affichage au format XML. Je passe les informations de connexion dans l'URL elle-même. Voici l'extrait de code:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
requestURL = "https://Administrator:Password@localhost:8443/abcd";

try { 
    InputStream is = null;
    URL url = new URL(requestURL);
    InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream();
    byte[] testByteArr = new byte[xmlInputStream.available()];
    xmlInputStream.read(testByteArr);
    System.out.println(new String(testByteArr));
    Document doc = db.parse(xmlInputStream);
    System.out.println("DOC="+doc);
} catch (MalformedURLException e) {
} 

Je crée un gestionnaire de confiance dans le programme qui ne valide pas les certificats signés/non signés. Mais, lors de l'exécution du programme ci-dessus, j'obtiens le serveur d'erreur renvoyé le code de réponse HTTP: 401 pour l'URL: https: // Administrateur: Mot de passe @ localhost: 8443/abcd

Je peux utiliser la même URL sur mon navigateur et il affiche correctement le xml. Veuillez me faire savoir comment faire fonctionner cela dans le programme Java.

17
Vish

401 signifie "Non autorisé", il doit donc y avoir quelque chose avec vos informations d'identification.

Je pense que Java URL ne prend pas en charge la syntaxe que vous montrez. Vous pouvez utiliser un authentificateur à la place.

Authenticator.setDefault(new Authenticator() {

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

puis en appelant simplement l'URL régulière, sans les informations d'identification.

L'autre option consiste à fournir les informations d'identification dans un en-tête:

String loginPassword = login+ ":" + password;
String encoded = new Sun.misc.BASE64Encoder().encode (loginPassword.getBytes());
URLConnection conn = url.openConnection();
conn.setRequestProperty ("Authorization", "Basic " + encoded);

PS: Il n'est pas recommandé d'utiliser ce Base64Encoder mais ce n'est que pour montrer une solution rapide. Si vous souhaitez conserver cette solution, recherchez une bibliothèque qui le fait. Il y a plein.

32
Guillaume Polet

Essaye ça. Vous devez passer l'authentification pour faire savoir au serveur que c'est un utilisateur valide. Vous devez importer ces deux packages et devez inclure un pot jersy. Si vous ne voulez pas inclure le pot jersy, importez ce package

import Sun.misc.BASE64Encoder;

import com.Sun.jersey.core.util.Base64;
import Sun.net.www.protocol.http.HttpURLConnection;

puis,

String encodedAuthorizedUser = getAuthantication("username", "password");
URL url = new URL("Your Valid Jira URL");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser );

 public String getAuthantication(String username, String password) {
   String auth = new String(Base64.encode(username + ":" + password));
   return auth;
 }
1
Harshad Holkar