Autenticação Garantida REST

Autenticação Garantida REST

1. Visão geral

Neste tutorial, analisaremos como podemos autenticar comREST Assured para testar e validar uma API protegida corretamente.

The tool provides support for several authentication schemes:

  • Autenticação básica

  • Autenticação Digest

  • Autenticação de formulário

  • OAuth 1 e OAuth 2

E veremos exemplos para cada um.

2. Usando autenticação básica

The basic authentication scheme requer que o consumidor envie o ID do usuário e uma senha codificada emBase64.

O REST Assured fornece uma maneira fácil de configurar as credenciais exigidas pela solicitação:

given().auth()
  .basic("user1", "user1Pass")
  .when()
  .get("http://localhost:8080/spring-security-rest-basic-auth/api/foos/1")
  .then()
  .assertThat()
  .statusCode(HttpStatus.OK.value());

2.1. Autenticação preventiva

Como vimos ema previous post on Spring Security authentication, um servidor pode usara challenge-response mechanism para indicar explicitamente quando o consumidor precisa se autenticar para acessar o recurso.

Por padrão, REST Assured aguarda o desafio do servidor antes de enviar as credenciais.

Isso pode ser problemático em alguns casos, por exemplo, em que o servidor está configurado para recuperar um formulário de login em vez da resposta de desafio.

Por esse motivo, a biblioteca fornece apreemptive diretiva que podemos usar:

given().auth()
  .preemptive()
  .basic("user1", "user1Pass")
  .when()
  // ...

Com isso em vigor, o REST Assured enviará as credenciais sem esperar por uma respostaUnauthorized.

Quase nunca estamos interessados ​​em testar a capacidade de desafio do servidor. Therefore, we can normally add this command to avoid complications and the overhead of making an additional request.

3. Usando autenticação Digest

Embora isso também seja considerado um“weak” authentication method, usarDigest Authentication representa uma vantagem sobre o protocolo básico.

Isso se deve ao fato de esse esquema evitar o envio da senha em texto não criptografado.

Apesar dessa diferença, a implementação dessa forma de autenticação com REST Assured é muito semelhante à que seguimos na seção anterior:

given().auth()
  .digest("user1", "user1Pass")
  .when()
  // ...

Observe que, atualmente, a biblioteca suporta apenas autenticação desafiada para este esquema,so we can’t use preemptive() as we did earlier.

4. Usando autenticação de formulário

Muitos serviços fornecem um formulário HTML para a autenticação do usuário preenchendo os campos com suas credenciais.

Quando o usuário envia o formulário, o navegador executa uma solicitação POST com as informações.

Normalmente, o formulário indica o terminal que ele chamará com seu atributoaction, e cada campoinput corresponde a um parâmetro de formulário enviado na solicitação.

Se o formulário de login for simples o suficiente e seguir essas regras, poderemos contar com o REST Assured para descobrir esses valores para nós:

given().auth()
  .form("user1", "user1Pass")
  .when()
  // ...

De qualquer maneira, essa não é uma abordagem ideal, pois o REST Assured precisa executar uma solicitação adicional e analisar a resposta HTML para localizar os campos.

Também devemos ter em mente que o processo ainda pode falhar, por exemplo, se a página da web for complexa, ou se o serviço estiver configurado com um caminho de contexto que não está incluído no atributoaction.

Portanto, a melhor solução é fornecer a configuração nós mesmos, indicando explicitamente os três campos obrigatórios:

given().auth()
  .form(
    "user1",
    "user1Pass",
    new FormAuthConfig("/perform_login", "username", "password"))
  // ...

Além dessas configurações básicas, o REST Assured é fornecido com funcionalidade para:

  • detectar ou indicar um campo de token CSRF na página da web

  • use campos de formulário adicionais na solicitação

  • informações de log sobre o processo de autenticação

5. Suporte OAuth

OAuth é tecnicamente uma estruturaauthorization e não define nenhum mecanismo para autenticar um usuário.

Ainda assim, pode ser usado como base para a construção de um protocolo de autenticação e identidade, como é o caso deOpenID Connect.

5.1. OAuth 2.0

REST Assured permite configurar o token de acesso OAuth 2.0 para solicitar um recurso seguro:

given().auth()
  .oauth2(accessToken)
  .when()
  .// ...

A biblioteca não fornece nenhuma ajuda para obter o token de acesso, então teremos que descobrir como fazer isso nós mesmos.

Para os fluxos de credencial e senha do cliente, essa é uma tarefa simples, pois o token é obtido apenas apresentando as credenciais correspondentes.

Por outro lado, automatizar o fluxo do Código de autorização pode não ser tão fácil e provavelmente precisaremos da ajuda de outras ferramentas também.

Para entender corretamente este fluxo e o que é necessário paraobtain an Access Token, we can have a look at this great post on the subject.

5.2. OAuth 1.0a

No caso do OAuth 1.0a,REST Assured supplies a method that receives a Consumer Key, Secret, Access Token and Token Secret para acessar um recurso seguro:

given().accept(ContentType.JSON)
  .auth()
  .oauth(consumerKey, consumerSecret, accessToken, tokenSecret)
  // ...

Este protocolo requer entrada do usuário, portanto, obter os dois últimos campos não será uma tarefa trivial.

Observe que precisaremos adicionar a dependênciascribejava-apis em nosso projeto se estivermos usando os recursos do OAuth 2.0 com uma versão anterior a 2.5.0 ou se estivermos usando a funcionalidade OAuth 1.0a.

6. Conclusão

Neste tutorial, aprendemos como podemos autenticar para acessar APIs seguras usando REST Assured.

A biblioteca simplifica o processo de autenticação para praticamente qualquer esquema que implementamos.

Como sempre, podemos encontrar exemplos de trabalho com instruções emour Github repo.