Connexion à une URL distante nécessitant une authentification via Java

Comment me connecter à une URL distante en Java qui nécessite une authentification. J’essaie de trouver un moyen de modifier le code suivant pour pouvoir fournir un nom d’utilisateur / mot de passe par programmation afin qu’il ne lance pas un 401.

URL url = new URL(Ssortingng.format("http://%s/manager/list", _host + ":8080")); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 

Vous pouvez définir l’authentificateur par défaut pour les requêtes http comme ceci:

 Authenticator.setDefault (new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication ("username", "password".toCharArray()); } }); 

De plus, si vous avez besoin de plus de flexibilité, vous pouvez consulter Apache HttpClient , qui vous donnera plus d’options d’authentification (ainsi que la prise en charge des sessions, etc.).

Il existe une alternative native et moins intrusive, qui ne fonctionne que pour votre appel.

 URL url = new URL(“location address”); URLConnection uc = url.openConnection(); Ssortingng userpass = username + ":" + password; Ssortingng basicAuth = "Basic " + new Ssortingng(Base64.getEncoder().encode(userpass.getBytes())); uc.setRequestProperty ("Authorization", basicAuth); InputStream in = uc.getInputStream(); 

Vous pouvez également utiliser les éléments suivants, qui n’exigent pas l’utilisation de packages externes:

 URL url = new URL(“location address”); URLConnection uc = url.openConnection(); Ssortingng userpass = username + ":" + password; Ssortingng basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes()); uc.setRequestProperty ("Authorization", basicAuth); InputStream in = uc.getInputStream(); 

Si vous utilisez la connexion normale en entrant le nom d’utilisateur et le mot de passe entre le protocole et le domaine, c’est plus simple. Il fonctionne également avec et sans connexion.

Exemple d’URL: http: // utilisateur: pass@domain.com/url

 URL url = new URL("http://user:pass@domain.com/url"); URLConnection urlConnection = url.openConnection(); if (url.getUserInfo() != null) { Ssortingng basicAuth = "Basic " + new Ssortingng(new Base64().encode(url.getUserInfo().getBytes())); urlConnection.setRequestProperty("Authorization", basicAuth); } InputStream inputStream = urlConnection.getInputStream(); 

Comme je suis venu ici à la recherche d’un Android-Java-Answer je vais faire un bref résumé:

  1. Utilisez java.net.Authenticator comme montré par James van Huis
  2. Utilisez le client HTTP Apache Commons , comme dans cette réponse
  3. Utilisez java.net.URLConnection de base et définissez manuellement l’authentification-en-tête comme indiqué ici

Si vous souhaitez utiliser java.net.URLConnection avec l’authentification de base sous Android, essayez ce code:

 URL url = new URL("http://www.mywebsite.com/resource"); URLConnection urlConnection = url.openConnection(); Ssortingng header = "Basic " + new Ssortingng(android.util.Base64.encode("user:pass".getBytes(), android.util.Base64.NO_WRAP)); urlConnection.addRequestProperty("Authorization", header); // go on setting more request headers, reading the response, etc 

Soyez très prudent avec l’approche “Base64 (). Encode ()”, mon équipe et moi avons reçu 400 problèmes de requêtes Apache car il ajoute un \ r \ n à la fin de la chaîne générée.

Nous l’avons trouvé en train de renifler des paquets grâce à Wireshark.

Voici notre solution:

 import org.apache.commons.codec.binary.Base64; HttpGet getRequest = new HttpGet(endpoint); getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding()); private Ssortingng getBasicAuthenticationEncoding() { Ssortingng userPassword = username + ":" + password; return new Ssortingng(Base64.encodeBase64(userPassword.getBytes())); } 

J’espère que cela aide!

Utilisez ce code pour l’authentification de base.

 URL url = new URL(path); Ssortingng userPass = "username:password"; Ssortingng basicAuth = "Basic " + Base64.encodeToSsortingng(userPass.getBytes(), Base64.DEFAULT);//or //Ssortingng basicAuth = "Basic " + new Ssortingng(Base64.encode(userPass.getBytes(), Base64.No_WRAP)); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setRequestProperty("Authorization", basicAuth); urlConnection.connect(); 

Je voudrais fournir une réponse pour le cas où vous n’avez pas de contrôle sur le code qui ouvre la connexion. Comme je l’ai fait lorsque vous utilisez URLClassLoader pour charger un fichier URLClassLoader à partir d’un serveur protégé par mot de passe.

La solution Authenticator fonctionnerait mais présente l’inconvénient qu’elle tente d’abord d’atteindre le serveur sans mot de passe et uniquement après que le serveur a demandé un mot de passe. C’est un aller-retour inutile si vous savez déjà que le serveur aurait besoin d’un mot de passe.

 public class MyStreamHandlerFactory implements URLStreamHandlerFactory { private final ServerInfo serverInfo; public MyStreamHandlerFactory(ServerInfo serverInfo) { this.serverInfo = serverInfo; } @Override public URLStreamHandler createURLStreamHandler(Ssortingng protocol) { switch (protocol) { case "my": return new MyStreamHandler(serverInfo); default: return null; } } } public class MyStreamHandler extends URLStreamHandler { private final Ssortingng encodedCredentials; public MyStreamHandler(ServerInfo serverInfo) { Ssortingng strCredentials = serverInfo.getUsername() + ":" + serverInfo.getPassword(); this.encodedCredentials = Base64.getEncoder().encodeToSsortingng(strCredentials.getBytes()); } @Override protected URLConnection openConnection(URL url) throws IOException { Ssortingng authority = url.getAuthority(); Ssortingng protocol = "http"; URL directUrl = new URL(protocol, url.getHost(), url.getPort(), url.getFile()); HttpURLConnection connection = (HttpURLConnection) directUrl.openConnection(); connection.setRequestProperty("Authorization", "Basic " + encodedCredentials); return connection; } } 

Ceci enregistre un nouveau protocole my qui est remplacé par http lorsque des informations d’identification sont ajoutées. Donc, lors de la création du nouveau URLClassLoader suffit de remplacer http par my et tout va bien. Je sais que URLClassLoader fournit un constructeur qui prend URLStreamHandlerFactory mais cette fabrique n’est pas utilisée si l’URL pointe vers un fichier jar.

ANDROD IMPLEMENTATION Une méthode complète pour demander une réponse de données / chaîne à un service Web demandant une autorisation avec un nom d’utilisateur et un mot de passe

 public static Ssortingng getData(Ssortingng uri, Ssortingng userName, Ssortingng userPassword) { BufferedReader reader = null; byte[] loginBytes = (userName + ":" + userPassword).getBytes(); SsortingngBuilder loginBuilder = new SsortingngBuilder() .append("Basic ") .append(Base64.encodeToSsortingng(loginBytes, Base64.DEFAULT)); try { URL url = new URL(uri); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.addRequestProperty("Authorization", loginBuilder.toSsortingng()); SsortingngBuilder sb = new SsortingngBuilder(); reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); Ssortingng line; while ((line = reader.readLine())!= null){ sb.append(line); sb.append("\n"); } return sb.toSsortingng(); } catch (Exception e) { e.printStackTrace(); return null; } finally { if (null != reader){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } 

Je l’ai fait de cette façon, vous devez le faire simplement copier coller, il sera heureux

  HttpURLConnection urlConnection; Ssortingng url; // Ssortingng data = json; Ssortingng result = null; try { Ssortingng username ="danish.hussain@gmail.com"; Ssortingng password = "12345678"; Ssortingng auth =new Ssortingng(username + ":" + password); byte[] data1 = auth.getBytes(UTF_8); Ssortingng base64 = Base64.encodeToSsortingng(data1, Base64.NO_WRAP); //Connect urlConnection = (HttpURLConnection) ((new URL(urlBasePath).openConnection())); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", "application/json"); urlConnection.setRequestProperty("Authorization", "Basic "+base64); urlConnection.setRequestProperty("Accept", "application/json"); urlConnection.setRequestMethod("POST"); urlConnection.setConnectTimeout(10000); urlConnection.connect(); JSONObject obj = new JSONObject(); obj.put("MobileNumber", "+97333746934"); obj.put("EmailAddress", "danish.hussain@mee.com"); obj.put("FirstName", "Danish"); obj.put("LastName", "Hussain"); obj.put("Country", "BH"); obj.put("Language", "EN"); Ssortingng data = obj.toSsortingng(); //Write OutputStream outputStream = urlConnection.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); writer.write(data); writer.close(); outputStream.close(); int responseCode=urlConnection.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { //Read BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8")); Ssortingng line = null; SsortingngBuilder sb = new SsortingngBuilder(); while ((line = bufferedReader.readLine()) != null) { sb.append(line); } bufferedReader.close(); result = sb.toSsortingng(); }else { // return new Ssortingng("false : "+responseCode); new Ssortingng("false : "+responseCode); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } 

Depuis Java 9, vous pouvez le faire

 URL url = new URL("http://www.example.com"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setAuthenticator(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication ("USER", "PASS".toCharArray()); } });