Como fazer a autenticação HTTP no Android?
-
21-09-2019 - |
Pergunta
Estou verificando a classe org.apache.http.auth. Mais alguma referência ou exemplo, se alguém tiver?
Solução
Eu não conheci esse pacote em particular antes, mas diz que é para a autenticação HTTP do lado do cliente, o que pude fazer no Android usando o java.net
APIs, assim:
Authenticator.setDefault(new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("myuser","mypass".toCharArray());
}});
HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection();
c.setUseCaches(false);
c.connect();
Obviamente, seu getPasswordAuthentication () provavelmente deve fazer algo mais inteligente do que retornar uma constante.
Se você está tentando fazer um pedido com um corpo (por exemplo POST
) com autenticação, cuidado com Edição 4326 do Android. Eu vinculei uma correção sugerida à plataforma lá, mas há uma solução alternativa simples se você quiser apenas autenticação básica: não se preocupe com o autenticador e, em vez disso, faça isso:
c.setRequestProperty("Authorization", "basic " +
Base64.encode("myuser:mypass".getBytes(), Base64.NO_WRAP));
Outras dicas
Para mim, funcionou,
final String basicAuth = "Basic " + Base64.encodeToString("user:password".getBytes(), Base64.NO_WRAP);
Apache httpClient:
request.setHeader("Authorization", basicAuth);
HttpurlConnection:
connection.setRequestProperty ("Authorization", basicAuth);
Você pode inserir manualmente o cabeçalho HTTP para solicitar:
HttpGet request = new HttpGet(...);
request.setHeader("Authorization", "Basic "+Base64.encodeBytes("login:password".getBytes()));
O método manual funciona bem com a importação Android.util.base64, mas certifique -se de definir base64.no_wrap na codificação de chamada:
String basicAuth = "Basic " + new String(Base64.encode("user:pass".getBytes(),Base64.NO_WRAP ));
connection.setRequestProperty ("Authorization", basicAuth);
Para meus projetos Android, usei a biblioteca Base64 a partir daqui:
É uma biblioteca muito extensa e até agora não tive problemas com ela.
Isso funciona para mim
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.setRequestProperty("Authorization", "basic " +
Base64.encode("username:password".getBytes()));
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is = conn.getInputStream();