

# Gerar uma solicitação pré-assinada com a biblioteca WebSocket
<a name="network-analyzer-generate-request"></a>

A seguir, descrevemos como gerar uma solicitação pré-assinada para que seja possível utilizar a biblioteca WebSocket para enviar solicitações ao serviço.

## Adicionar uma política para solicitações WebSocket ao perfil do IAM
<a name="network-analyzer-iam"></a>

Para usar o protocolo WebSocket para chamar o analisador de rede, anexe a política a seguir ao perfil do AWS Identity and Access Management (IAM) que faz a solicitação. 

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iotwireless:StartNetworkAnalyzerStream",
            "Resource": "*"
        }
    ]
}
```

## Criar um URL pré-assinado
<a name="network-analyzer-presigned-url"></a>

Crie um URL para a solicitação WebSocket que contenha as informações necessárias para configurar a comunicação entre o aplicativo e o analisador de rede. Para verificar a identidade da solicitação, o streaming WebSocket usa o processo do Amazon Signature versão 4 para assinar solicitações. Para obter mais informações sobre o Signature versão 4, consulte [Assinar solicitações de API da AWS](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) na *Referência geral do Amazon Web Services*.

Para chamar o analisador de rede, use o URL de solicitação `StartNetworkAnalyzerStream`. A solicitação será assinada usando as credenciais do perfil do IAM mencionado anteriormente. O URL tem o formato a seguir com quebras de linha adicionadas para facilitar a leitura.

```
GET wss://api.iotwireless.<region>.amazonaws.com/start-network-analyzer-stream?X-Amz-Algorithm=AWS4-HMAC-SHA256
   &X-Amz-Credential=Signature Version 4 credential scope
   &X-Amz-Date=date
   &X-Amz-Expires=time in seconds until expiration
   &X-Amz-Security-Token=security-token
   &X-Amz-Signature=Signature Version 4 signature 
   &X-Amz-SignedHeaders=host
```

Use os valores a seguir para os parâmetros de Signature versão 4:
+ **X-Amz-Algorithm** – O algoritmo que você está usando no processo de assinatura. O único valor válido é `AWS4-HMAC-SHA256`.
+ **X-Amz-Credential** – Uma string separada por barras ("/") formada concatenando o ID de chave de acesso e os componentes de escopo de credencial. O escopo de credencial inclui a data no formato AAAAMMDD, a Região da AWS, o nome do serviço e uma string de terminação (aws4\$1request).
+ **X-Amz-Date** – A data e a hora em que a assinatura foi criada. Gere a data e a hora seguindo as instruções em [Tratamento de datas no Signature versão 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html) na *Referência geral do Amazon Web Services*.
+ **X-Amz-Expires** – O tempo, em segundos, até que as credenciais expirem. O valor máximo é de 300 segundos (5 minutos).
+ **X-Amz-Security-Token** – (opcional) Um token do Signature versão 4 para credenciais temporárias. Se você especificar esse parâmetro, inclua-o na solicitação canônica. Para obter mais informações, consulte [Solicitação de credenciais de segurança temporárias](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) no *Guia do usuário do AWS Identity and Access Management*.
+ **X-Amz-Signature** – A assinatura do Signature versão 4 que você gerou para a solicitação.
+ **X-Amz-SignedHeaders** – Os cabeçalhos que são assinados ao criar a assinatura para a solicitação. O único valor válido é `host`.

## Crie o URL da solicitação e crie a assinatura do Signature versão 4
<a name="connect-iot-network-analyzer-construct-url-sign"></a>

Para criar o URL para a solicitação e criar a assinatura do Signature versão 4, siga as etapas a seguir. Os exemplos estão em pseudocódigo.

### Tarefa 1: Criar uma solicitação canônica
<a name="canonical-request"></a>

Crie uma string que inclua as informações da solicitação em um formato padronizado. Isso garante que quando a AWS receber a solicitação, ela poderá calcular a mesma assinatura que você calcular em [Tarefa 3: Calcular a assinatura](#calculate-signature). Para obter mais informações, consulte [Criar uma solicitação canônica para o Signature versão 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html) na *Referência geral do Amazon Web Services*.

1. Defina variáveis para a solicitação no seu aplicativo.

   ```
   # HTTP verb
   method = "GET"
   # Service name
   service = "iotwireless"
   # Região da AWS
   region = "Região da AWS"
   # Service streaming endpoint
   endpoint = "wss://api.iotwireless.region.amazonaws.com"
   # Host
   host = "api.iotwireless.<region>.amazonaws.com"
   # Date and time of request
   amz-date = YYYYMMDD'T'HHMMSS'Z'
   # Date without time for credential scope
   datestamp = YYYYMMDD
   ```

1. Crie um URI canônico (identificador uniforme de recursos). O URI canônico é a parte do URI entre o domínio e a string de consulta.

   ```
   canonical_uri = "/start-network-analyzer-stream"
   ```

1. Crie cabeçalhos canônicos e cabeçalhos assinados. Observe o `\n` que aparece no final dos cabeçalhos canônicos.
   + Anexe o nome do cabeçalho em minúscula seguido por dois pontos.
   + Anexe uma lista separada por vírgulas de valores para esse cabeçalho. Não classifique os valores em cabeçalhos que têm vários valores.
   + Anexe uma nova linha (`\n`).

   ```
   canonical_headers = "host:" + host + "\n"
   signed_headers = "host"
   ```

1. Faça uma correspondência entre o algoritmo e o algoritmo de hash. Você deve usar SHA-256.

   ```
   algorithm = "AWS4-HMAC-SHA256"
   ```

1. Crie o escopo da credencial, que define o escopo da chave derivada como a data, a Região e o serviço ao qual a solicitação foi feita.

   ```
   credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
   ```

1. Crie a string de consulta canônica. Os valores de string de consulta devem ser codificados por URI e classificados por nome.
   + Classifique os nomes de parâmetro por ponto de código de caracteres em ordem ascendente. Parâmetros com nomes duplicados devem ser classificados pelo valor. Por exemplo, um nome de parâmetro que começa com a letra maiúscula F precede um nome de parâmetro que começa com uma letra minúscula b.
   + Não codifique em URI nenhum dos caracteres não reservados definidos pela [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986): A–Z, a–z, 0–9, hífen ( - ), sublinhado ( \$1 ), ponto ( . ) e til ( \$1 ).
   + Codifique em percentual todos os outros caracteres com %XY, em que X e Y são caracteres hexadecimais (de 0 a 9 e maiúsculas de A a F). Por exemplo, o caractere de espaço deve ser codificado como %20 (não usando '\$1', como alguns esquemas de codificação) e deve haver caracteres UTF-8 estendidos na forma %XY%ZA%BC.
   + Codifique duas vezes todos os caracteres de sinal de igual (=) em valores de parâmetro.

   ```
   canonical_querystring  = "X-Amz-Algorithm=" + algorithm
   canonical_querystring += "&X-Amz-Credential="+ URI-encode(access key + "/" + credential_scope)
   canonical_querystring += "&X-Amz-Date=" + amz_date 
   canonical_querystring += "&X-Amz-Expires=300"
   canonical_querystring += "&X-Amz-Security-Token=" + token
   canonical_querystring += "&X-Amz-SignedHeaders=" + signed_headers
   canonical_querystring += "&language-code=en-US&media-encoding=pcm&sample-rate=16000"
   ```

1. Crie um hash da carga útil. Para uma solicitação GET, a carga útil é uma string vazia.

   ```
   payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
   ```

1. Combine todos os elementos para criar a solicitação canônica.

   ```
   canonical_request = method + '\n' 
      + canonical_uri + '\n' 
      + canonical_querystring + '\n' 
      + canonical_headers + '\n' 
      + signed_headers + '\n' 
      + payload_hash
   ```

### Tarefa 2: Criar a string para assinar
<a name="create-urlsign"></a>

A string para assinar inclui metainformações sobre sua solicitação. Você usará a string para assinar na próxima etapa, quando calcular a assinatura da solicitação. Para obter mais informações, consulte [Criar uma string para assinar o Signature versão 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html) na *Referência geral do Amazon Web Services*.

```
string_to_sign=algorithm + "\n"
   + amz_date + "\n"
   + credential_scope + "\n"
   + HashSHA256(canonical_request.Encode("utf-8")).HexDigest()
```

### Tarefa 3: Calcular a assinatura
<a name="calculate-signature"></a>

Você derivará uma chave de assinatura da sua chave de acesso secreta da AWS. Para obter um grau maior de proteção, a chave derivada é específica à data, ao serviço e à Região da AWS. Você usa a chave derivada para assinar a solicitação. Para obter mais informações, consulte [Calcular a assinatura do Signature versão 4 da AWS](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html) na *Referência geral do Amazon Web Services*.

O código pressupõe que você tenha implementado a função `GetSignatureKey` para gerar uma chave de assinatura. Para obter mais informações e exemplos de funções, consulte [Exemplos de como derivar uma chave de assinatura do Signature versão 4](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html) na *Referência geral do Amazon Web Services*.

A função `HMAC(key, data)` representa uma função HMAC-SHA256 que retorna os resultados em formato binário.

```
#Create the signing key
signing_key = GetSignatureKey(secret_key, datestamp, region, service)
                
# Sign the string_to_sign using the signing key
signature = HMAC.new(signing_key, (string_to_sign).Encode("utf-8"), Sha256()).HexDigest
```

### Tarefa 4: Adicionar informações de assinatura à solicitação e criar o URL da solicitação
<a name="sign-request"></a>

Depois de calcular a assinatura, adicione-a à string de consulta. Para obter mais informações, consulte [Adicionar a assinatura à solicitação](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html) na *Referência geral do Amazon Web Services*.

```
#Add the authentication information to the query string
canonical_querystring += "&X-Amz-Signature=" + signature
                
# Sign the string_to_sign using the signing key
request_url = endpoint + canonical_uri + "?" + canonical_querystring
```

## Próximas etapas
<a name="network-analyzer-request-next"></a>

Você pode usar o URL da solicitação com a biblioteca WebSocket para fazer a solicitação ao serviço e observar as mensagens. Para ter mais informações, consulte [Mensagens e códigos de status do WebSocket](network-analyer-messages-status.md).