Autenticação com HttpUrlConnection

Autenticação com HttpUrlConnection

1. Visão geral

Neste tutorial, vamos explorar como autenticarHTTP requests usando a classeHttpUrlConnection.

2. Autenticação HTTP

Em aplicativos da web, os servidores podem exigir que os clientes se autentiquem. Deixar de cumprir normalmente resulta no servidor retornando um código de status HTTP 401 (não autorizado).

Existem váriosauthentication schemes que diferem na força de segurança que fornecem. No entanto, o esforço de implementação também varia.

Vamos ver três deles:

  • basic é um esquema sobre o qual falaremos mais na próxima seção

  • digest aplica algoritmos de hash nas credenciais do usuário e um nonce especificado pelo servidor

  • bearer utiliza tokens de acesso como parte deOAuth 2.0

3. Autenticação básica

A autenticação básica permite que os clientes se autentiquem usando umencoded user name and password por meio do cabeçalhoAuthorization:

GET / HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd29yZA==

Para criar o nome de usuário codificado e a sequência de senha, simplesmente codificamos Base64 o nome de usuário, seguido de dois pontos, seguido da senha:

basic(user, pass) = base64-encode(user + ":" + pass)

Lembre-se de alguns cuidados deRFC 7617, embora:

Esse esquema não é considerado um método seguro de autenticação do usuário, a menos que seja usado em conjunto com algum sistema externo seguro, como TLS

Isso ocorre, é claro, já que o nome do usuário e a senha passam como texto sem formatação pela rede em cada solicitação.

4. Autenticar uma conexão

Ok, com isso como pano de fundo, vamos pular para a configuração deHttpUrlConnection para usar HTTP Basic.

A classeHttpUrlConnection pode enviar solicitações, mas primeiro, temos que obter uma instância dela a partir de um objeto URL:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

Uma conexão oferece muitos métodos para configurá-la, comosetRequestMethodesetRequestProperty.

Por mais estranho que pareçasetRequestProperty, este é o que queremos.

Depois de juntar o nome de usuário e senha usando “:”, podemos usar a classejava.util.Base64 para codificar as credenciais:

String auth = user + ":" + password;
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));

Em seguida, criamos o valor do cabeçalho a partir do literal "Básico" seguido pelas credenciais codificadas:

String authHeaderValue = "Basic " + new String(encodedAuth);

Em seguida, chamamos o métodosetRequestProperty(key, value) para autenticar a solicitação. Conforme mencionado anteriormente,we have to use “Authorization” as our header and “Basic ” + encoded credentials as our value:

connection.setRequestProperty("Authorization", authHeaderValue);

Finalmente, precisamos realmente enviar a solicitação HTTP, como por exemplo chamandogetResponseCode(). Como resultado, obtemos um código de resposta HTTP do servidor:

int responseCode = connection.getResponseCode();

Qualquer coisa na família 2xx significa que nossa solicitação, incluindo a parte de autenticação, foi válida!

5. JavaAuthenticator

A implementação de autenticação básica acima mencionada requer a configuração do cabeçalho de autorização para cada solicitação. Em contraste, a classe abstratajava.net.Authenticator permitesetting the authentication globally for all connections.

Precisamos estender a aula primeiro. Em seguida, chamamos o método estáticoAuthenticator.setDefault() para registrar uma instância do nosso autenticador:

Authenticator.setDefault(new BasicAuthenticator());

Nossa classe básica de autenticação apenas substitui o método não abstratogetPasswordAuthentication() da classe base:

private final class BasicAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}

A classe Authenticator utiliza as credenciais do nosso autenticador para cumprir automaticamente o esquema de autenticação exigido pelo servidor.

6. Conclusão

Neste breve tutorial, vimos como aplicar autenticação básica a solicitações enviadas viaHttpUrlConnection.

Como sempre, o exemplo de código pode ser encontradoon GitHub.