Baixe um arquivo da internet usando java: Como autenticar?

Graças a esta discussão Como baixar e salvar um arquivo da Internet usando Java? Eu sei como baixar um arquivo, agora meu problema é que eu preciso autenticar no servidor do qual estou fazendo o download. É uma interface http para um servidor subversion. Em qual campo eu preciso procurar?

Usando o código postado no último comentário, recebo esta exceção:

java.io.IOException: Server returned HTTP response code: 401 for URL: http://myserver/systemc-2.0.1.tgz at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1305) at java.net.URL.openStream(URL.java:1009) at mypackage.Installer.installSystemc201(Installer.java:29) at mypackage.Installer.main(Installer.java:38) 

Obrigado,

Você estende a class Authenticator e registra-a. Os javadocs no link explicam como.

Eu não sei se isso funciona com o método nio que obteve a resposta aceita para a pergunta, mas com certeza funciona da maneira antiga que foi a resposta sob aquela.

Na implementação da class authenticator, você provavelmente usará uma PasswordAuthentication e replaceá o método getPasswordAuthentication () da implementação do Authenticator para retorná-la. Essa será a class que recebe o nome de usuário e a senha que você precisa.

Por sua solicitação, aqui está um código de amostra:

 public static final String USERNAME_KEY = "username"; public static final String PASSWORD_KEY = "password"; private final PasswordAuthentication authentication; public MyAuthenticator(Properties properties) { String userName = properties.getProperty(USERNAME_KEY); String password = properties.getProperty(PASSWORD_KEY); if (userName == null || password == null) { authentication = null; } else { authentication = new PasswordAuthentication(userName, password.toCharArray()); } } protected PasswordAuthentication getPasswordAuthentication() { return authentication; } 

E você o registra no método principal (ou em algum lugar ao longo da linha antes de chamar o URL):

 Authenticator.setDefault(new MyAuthenticator(properties)); 

O uso é simples, mas acho a API complicada e um pouco atrasada em relação a como você normalmente pensa sobre essas coisas. Muito típico do design singleton.

Este é algum código que eu escrevi que busca um site e exibe o conteúdo para System.out. Utiliza a autenticação básica:

 import java.net.*; import java.io.*; public class foo { public static void main(String[] args) throws Exception { URL yahoo = new URL("http://www.MY_URL.com"); String passwdstring = "USERNAME:PASSWORD"; String encoding = new sun.misc.BASE64Encoder().encode(passwdstring.getBytes()); URLConnection uc = yahoo.openConnection(); uc.setRequestProperty("Authorization", "Basic " + encoding); InputStream content = (InputStream)uc.getInputStream(); BufferedReader in = new BufferedReader (new InputStreamReader (content)); String line; while ((line = in.readLine()) != null) { System.out.println (line); } in.close(); } 

Problemas com o código acima:

  1. Este código não está pronto para produção (mas isso faz sentido).

  2. O código produz este aviso do compilador:

 foo.java:11: aviso: sun.misc.BASE64Encoder é uma API proprietária da Sun e pode ser removido em uma versão futura
       sun.misc.BASE64Encoder (). encode (passwdstring.getBytes ());
               ^ 1 aviso

Um deve usar a class Authenticator, mas para a vida de mim, eu não conseguia descobrir como e eu não consegui encontrar nenhum exemplo também, o que apenas mostra que as pessoas de Java não gostam quando você usa o linguagem para fazer coisas legais. 😛

Portanto, o acima não é uma boa solução, mas funciona e pode ser facilmente modificado mais tarde.

Escreva sua class substituta para o Autenticador:

 import java.net.Authenticator; import java.net.PasswordAuthentication; public class MyAuthenticator extends Authenticator { private static String username = ""; private static String password = ""; protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication (MyAuthenticator.username, MyAuthenticator.password.toCharArray()); } public static void setPasswordAuthentication(String username, String password) { MyAuthenticator.username = username; MyAuthenticator.password = password; } } 

Escreva sua aula principal:

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Authenticator; import java.net.MalformedURLException; import java.net.URL; public class MyMain{ public static void main(String[] args) { URL url; InputStream is = null; BufferedReader br; String line; // Install Authenticator MyAuthenticator.setPasswordAuthentication("Username", "Password"); Authenticator.setDefault (new MyAuthenticator ()); try { url = new URL("Your_URL_Here"); is = url.openStream(); // throws an IOException br = new BufferedReader(new InputStreamReader(is)); while ((line = br.readLine()) != null) { System.out.println(line); } } catch (MalformedURLException mue) { mue.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if (is != null) is.close(); } catch (IOException ioe) { // nothing to see here } } } } 

Você já tentou construir seu URL no formato http: // usuário: senha @ domínio / caminho ?

Eu sugiro verificar HttpClient do apache http://hc.apache.org/httpclient-3.x/ faz o download / autenticação muito fácil

Esta biblioteca de código aberto, http://spnego.sourceforge.net , também tem alguns exemplos de como usar sua class SpnegoHttpURLConnection.

Um dos construtores da class permite que você passe um nome de usuário e senha.

Dê uma olhada no java doc da class para os exemplos.