

# Autenticação de solicitações: uso de parâmetros de consulta (AWS Signature Version 4)
<a name="sigv4-query-string-auth"></a>

Conforme descrito na visão geral da autenticação (consulte [Métodos de autenticação](sig-v4-authenticating-requests.md#auth-methods-intro)), você pode fornecer informações de autenticação usando parâmetros de string de consulta. Usar parâmetros de consulta para autenticar solicitações é útil quando você deseja expressar uma solicitação inteiramente em um URL. Esse método também é conhecido como pré-assinatura de um URL. 

Em um cenário de caso de uso para URLs pré-assinados, você pode conceder acesso temporário aos recursos do Amazon S3. Por exemplo, você pode incorporar um URL pré-assinado em seu site ou, se preferir, usá-lo em um cliente de linha de comando (como Curl) para baixar objetos.

**nota**  
Você também pode usar a AWS CLI para criar URLs pré-assinados. Para ter mais informações, consulte [`presign`](https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html) na *Referência de comandos da AWS CLI*.

O exemplo a seguir é um URL pré-assinado. 

 

```
https://examplebucket.s3.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential={{<your-access-key-id>}}/20130721/us-east-1/s3/aws4_request
&X-Amz-Date=20130721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature={{<signature-value>}}
```



No URL de exemplo, observe:

 
+ Os feeds de linha são adicionados para legibilidade.
+ O valor de `X-Amz-Credential` no URL exibe o caractere “/” somente para facilitar a leitura. Na prática, deve ser codificado como `%2F`. Por exemplo:

   

  ```
  &X-Amz-Credential={{<your-access-key-id>}}%2F20130721%2Fus-east-1%2Fs3%2Faws4_request
  ```

  

A tabela a seguir descreve os parâmetros de consulta no URL que fornecem informações de autenticação. 


| Nome de parâmetro de query string | Valor de exemplo | 
| --- | --- | 
| X-Amz-Algorithm | Identifica a versão da assinatura da AWS e o algoritmo que você usou para calcular a assinatura. <br />Para o AWS Signature Version 4, você define esse valor de parâmetro como `AWS4-HMAC-SHA256`. Essa string identifica o AWS Signature Version 4 (AWS4) e o algoritmo HMAC-SHA256 (HMAC-SHA256).  | 
| X-Amz-Credential | Além do ID da chave de acesso, esse parâmetro também fornece o escopo (Região da AWS e serviço) para o qual a assinatura é válida. O valor deve corresponder ao escopo usado nos cálculos de assinatura, abordados na seção a seguir. A forma geral para esse valor de parâmetro é:<br /> <pre>{{<your-access-key-id>}}/{{<date>}}/{{<Região da AWS>}}/{{<AWS-service>}}/aws4_request</pre><br />Por exemplo: <br /> <pre>AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request</pre><br />Para o Amazon S3, a string {{AWS-service}} é `s3`. Para conferir a lista de strings da `AWS-region` do S3, consulte [Regiões e endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) na *Referência geral da AWS*. | 
| X-Amz-Date | O formato de data e hora deve seguir o padrão ISO 8601 e deve ter a formatação "{{aaaaMMdd}}T{{HHmmss}}Z". Por exemplo, se a data e a hora forem “08/01/2016 15:32:41.982-700”, elas primeiro deverão ser convertidas em UTC (Tempo Universal Coordenado) e depois enviadas como “20160801T223241Z”.  | 
| X-Amz-Expires | Fornece o período, em segundos, de validade do URL pré-assinado gerado. Por exemplo, `86400` (24 horas). Esse valor é um inteiro. O valor mínimo que você pode definir é 1 e o máximo é 604800 (sete dias).<br />O URL pré-assinado pode ser válido por no máximo sete dias, pois a chave de assinatura usada no cálculo da assinatura é válida por até sete dias.  | 
| X-Amz-SignedHeaders | Lista os cabeçalhos usados para calcular a assinatura. Os seguintes cabeçalhos são obrigatórios para os cálculos da assinatura:<br /> +  O cabeçalho HTTP `host`. <br />+  Todo cabeçalho `x-amz-*` que você pretende adicionar à solicitação. <br />   Para maior segurança, é necessário assinar todos os cabeçalhos de solicitação que pretende incluir na solicitação.  | 
| X-Amz-Signature | Fornece a assinatura para autenticar a solicitação. Essa assinatura deve corresponder à assinatura calculada pelo Amazon S3; caso contrário, o Amazon S3 negará a solicitação. Por exemplo, ., ` 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7`<br />Os cálculos de assinatura serão descritos na seção a seguir. | 
| X-Amz-Security-Token | Parâmetro de credencial opcional ao usar credenciais provenientes do serviço STS. | 



## Cálculo de uma assinatura
<a name="query-string-auth-v4-signing"></a>

O diagrama a seguir ilustra o processo de cálculo da assinatura. 

 

![Processo de assinatura do AWS Signature Version 4 com etapas de solicitação canônica, string a ser assinada e geração de assinatura.](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/developerguide/images/sigV4-using-query-params.png)




A tabela a seguir descreve as funções exibidas no diagrama. É necessário implementar o código para essas funções.


| Função | Descrição | 
| --- | --- | 
| Lowercase() | Converta a string em letras minúsculas. | 
| Hex() | Codificação de base 16 em letras minúsculas. | 
| SHA256Hash() | Função de hash criptográfico do Secure Hash Algorithm (SHA). | 
| HMAC-SHA256() | Calcula o HMAC usando o algoritmo SHA256 com a chave de assinatura fornecida. Essa é a assinatura final. | 
| Trim() | Remova qualquer espaço em branco inicial e final.  | 
| UriEncode() | O URI codifica cada byte. O UriEncode() deve aplicar as seguintes regras:+  O URI codifica cada byte, exceto os caracteres não reservados: “A”-“Z”, “a”-“z”, “0”-“9”, “-”, “.”, “\_” e “\~”.  <br />+ O caractere de espaço é um caractere reservado e deve ser codificado como “%20” (e não como “\+”). <br />+ Cada byte codificado por URI é formado por um “%” e o valor hexadecimal de dois dígitos do byte. <br />+ As letras no valor hexadecimal devem estar em maiúsculas; por exemplo, “%1A”. <br />+ Codifique o caractere de barra, “/”, em todos os lugares, exceto no nome da chave do objeto. Por exemplo, se o nome da chave do objeto for `photos/Jan/sample.jpg`, a barra no nome da chave não está codificada.  As funções UriEncode padrão fornecidas por sua plataforma de desenvolvimento podem não funcionar devido às diferenças na implementação e à ambiguidade relacionada nos RFCs subjacentes. É recomendável escrever sua própria função UriEncode personalizada para garantir que a codificação funcione. <br />Veja a seguir um exemplo da função UriEncode() em Java.<pre>public static String UriEncode(CharSequence input, boolean encodeSlash) {<br />          StringBuilder result = new StringBuilder();<br />          for (int i = 0; i < input.length(); i++) {<br />              char ch = input.charAt(i);<br />              if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {<br />                  result.append(ch);<br />              } else if (ch == '/') {<br />                  result.append(encodeSlash ? "%2F" : ch);<br />              } else {<br />                  result.append(toHexUTF8(ch));<br />              }<br />          }<br />          return result.toString();<br />      }</pre> | 

Para obter mais informações sobre o processo de assinatura (detalhes da criação de uma solicitação canônica, string a ser assinada e cálculos de assinatura), consulte [Cálculos de assinatura para o cabeçalho de autorização: transferência de carga útil em uma única parte (AWS Signature Version 4)](sig-v4-header-based-auth.md). O processo geralmente é o mesmo, mas a criação de **CanonicalRequest** em um URL pré-assinado é diferente da seguinte forma:

 
+ Não inclua um hash de carga útil na **solicitação canônica** porque, ao criar um URL pré-assinado, você não conhece o conteúdo da carga útil porque o URL é usado para carregar uma carga útil arbitrária. Em vez disso, você usa uma string constante `UNSIGNED-PAYLOAD`. 
+ A **string de consulta canônica** deve incluir todos os parâmetros de consulta da tabela anterior, exceto `X-Amz-Signature`. 
+ Para o S3, é necessário incluir o parâmetro de consulta `X-Amz-Security-Token` no URL ao usar credenciais provenientes do serviço STS.
+ Os **cabeçalhos canônicos** devem incluir o cabeçalho HTTP `host`. Se você pretende incluir qualquer um dos cabeçalhos `x-amz-* `, esses cabeçalhos também deverão ser adicionados para o cálculo da assinatura. Se desejar, adicione todos os outros cabeçalhos que pretende incluir na solicitação. Para maior segurança, você deve assinar o máximo de cabeçalhos possível. Se você adicionar um cabeçalho assinado que também seja um parâmetro de consulta assinado e o valor deles for diferente, será gerado um erro `InvalidRequest`, pois a entrada é conflitante.

## Um exemplo
<a name="query-string-auth-v4-signing-example"></a>

Suponha que você tenha um objeto `test.txt` em seu bucket `examplebucket`. Você deseja compartilhar esse objeto com outras pessoas por um período de 24 horas (86400 segundos) criando um URL pré-assinado. 

 

```
https://examplebucket.s3.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
&X-Amz-Signature={{<signature-value>}}
```

As etapas a seguir ilustram primeiro os cálculos da assinatura e, em seguida, a construção do URL pré-assinado. O exemplo faz as seguintes suposições adicionais:

 
+ O carimbo de data/hora da solicitação é `Fri, 24 May 2013 00:00:00 GMT`.
+ O bucket está na região Leste dos EUA (Norte da Virgínia) e a credencial `Scope` e os cálculos de `Signing Key` usam `us-east-1` como especificador da região.  Para obter mais informações, consulte [Regiões e endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) no *Referência geral da AWS*. 

Você pode usar esse exemplo como um caso de teste para verificar a assinatura que seu código calcula. No entanto, você deve usar o mesmo nome de bucket, chave de objeto, carimbo de data/hora e as seguintes credenciais de exemplo:


| Parâmetro | Valor | 
| --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /test.txt
      X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
      host:examplebucket.s3.amazonaws.com
      
      host
      UNSIGNED-PAYLOAD
      ```

       

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
      ```

       

1. 

**SigningKey**

    

   ```
   signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "{{<YourSecretAccessKey>}}","20130524"),"us-east-1"),"s3"),"aws4_request")
   ```

    

1. 

**Signature**

    

   ```
   aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
   ```

    

   Agora você tem todas as informações para criar um URL pré-assinado. O URL resultante desse exemplo é mostrado a seguir (você pode usá-lo para comparar seu URL pré-assinado):

   ```
   https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
   ```

## Exemplo 2
<a name="query-string-auth-v4-signing-example-2"></a>

Veja a seguir um exemplo (não relacionado ao exemplo anterior) mostrando um URL pré-assinado com o parâmetro `X-Amz-Security-Token`.

```
https://examplebucket.s3.us-east-1.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D
&X-Amz-Signature={{<signature-value>}}
```