

# Genera una richiesta prefirmata con la libreria WebSocket
<a name="network-analyzer-generate-request"></a>

Di seguito viene illustrato come generare una richiesta prefirmata in modo da poter utilizzare la libreria WebSocket per inviare richieste al servizio.

## Aggiunta di una policy per le richieste WebSocket al ruolo IAM
<a name="network-analyzer-iam"></a>

Per utilizzare il protocollo WebSocket per chiamare, collegare la seguente policy al ruolo AWS Identity and Access Management (IAM) che effettua la richiesta. 

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

## Creare un URL prefirmato
<a name="network-analyzer-presigned-url"></a>

Crea un URL per la richiesta WebSocket che contiene le informazioni necessarie per configurare le comunicazioni tra l'applicazione e l'analizzatore di rete. Per verificare l'identità della richiesta, lo streaming WebSocket utilizza il processo Amazon Signature Version 4 per la firma delle richieste. Per ulteriori informazioni riguardo Signature Version 4, consulta [ Firma di richieste API AWS](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) nei *Riferimenti generali di Amazon Web Services*.

Per chiamare l'analizzatore di rete, utilizzare l'URL della richiesta `StartNetworkAnalyzerStream`. La richiesta verrà firmata utilizzando le credenziali per il ruolo IAM citato in precedenza. L'URL ha il formato seguente con l'aggiunta di interruzioni di riga per la leggibilità.

```
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
```

Utilizza i valori seguenti per i parametri Signature Version 4:
+ **X-Amz-Algorithm** - L'algoritmo utilizzato nel processo di firma. L'unico valore valido è `AWS4-HMAC-SHA256`.
+ **X-Amz-Credential** - Una stringa separata dalle barre ("/") che è formata concatenando i componenti ID chiave di accesso e componenti dell'ambito delle credenziali. L'ambito delle credenziali include la data nel formato AAAAMMGG, la regione AWS, il nome del servizio e una stringa di chiusura speciale (aws4\$1request).
+ **X-Amz-Date** — La data e l'ora di creazione della firma. Genera la data e l'ora seguendo le istruzioni riportate in [Gestione delle date in Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html) nei *Riferimenti generali di Amazon Web Services*.
+ **X-Amz-Expires** - L'intervallo di tempo in secondi fino alla scadenza delle credenziali. Il valore massimo è di 300 secondi (5 minuti).
+ **X-Amz-Security-Token** - (opzionale) Un token Signature Version 4 per le credenziali provvisorie. Se specifichi questo parametro, lo devi includere nella richiesta canonica. Per ulteriori informazioni, vedi [Richiesta di credenziali di sicurezza temporanee](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) nella *Guida per l'utente di AWS Identity and Access Management*.
+ **X-Amz-Signature** - La firma Signature Version 4 generata per la richiesta.
+ **X-Amz-SignedHeaders** - Le intestazioni firmate durante la creazione della firma per la richiesta. L'unico valore valido è `host`.

## Crea l'URL della richiesta e crea la firma Signature Version 4
<a name="connect-iot-network-analyzer-construct-url-sign"></a>

Per creare l'URL per la richiesta e creare la firma Signature Version 4, utilizzare la procedura seguente. Gli esempi sono in pseudocodice.

### Fase 1. Creazione di una richiesta canonica
<a name="canonical-request"></a>

Creare una stringa che include informazioni dalla richiesta in un formato standardizzato. In questo modo si ha la certezza che quando AWS riceve la richiesta, può calcolare la stessa firma già calcolata in [Task 3: calcolo della firma](#calculate-signature). Per ulteriori informazioni, consulta [Creazione di una richiesta canonica per Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html) nei *Riferimenti generali di Amazon Web Services*.

1. Definire le variabili per la richiesta nell'applicazione.

   ```
   # HTTP verb
   method = "GET"
   # Service name
   service = "iotwireless"
   # Regione AWS
   region = "Regione 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. Crea un URI canonico (identificatore uniforme della risorsa). L'URI canonico è la parte dell'URI tra il dominio e la stringa di query.

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

1. Crea le intestazioni canoniche e le intestazioni firmate. Notare la `\n` in coda nelle intestazioni canoniche.
   + Aggiungi il nome dell'intestazione in caratteri minuscoli seguito da due punti.
   + Aggiungi un elenco separato da virgole di valori per l'intestazione. Non ordinare i valori nelle intestazioni che presentano più valori.
   + Aggiungi una nuova riga (`\n`).

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

1. Eseguire la corrispondenza dell'algoritmo con l'algoritmo hash. È necessario utilizzare SHA-256.

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

1. Creare l'ambito delle credenziali che definisce gli ambiti della chiave derivata per la data, la regione e i servizi per cui è stata effettuata la richiesta.

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

1. Creare la stringa di query canonica. I valori della stringa di query devono essere codificati in base all'URI e ordinati in base al nome.
   + Organizza i nomi dei parametri per punto di codice carattere in ordine crescente. I parametri con nomi duplicati devono essere ordinati in base al valore. Ad esempio, un nome di parametro che inizia con la lettera maiuscola F precede un nome di parametro che inizia con la lettera minuscola b.
   + Non codificare i caratteri non riservati definiti da [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986): A-Z, a-z, 0-9, trattino ( - ), trattino basso ( \$1 ), punto ( . ), e tilde ( \$1 ).
   + Codifica tutti gli altri caratteri con codifica percentuale con %XY, dove X e Y sono caratteri esadecimali (0-9 e A-F maiuscole). Ad esempio, i caratteri di spaziatura devono essere codificati come %20 (non utilizzando '\$1', come in alcuni schemi di codifica) e i caratteri UTF-8 estesi devono essere nel formato %XY%ZA%BC.
   + Esegui la doppia codifica di qualsiasi carattere uguale (=) nei valori dei parametri.

   ```
   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. Creare un hash di payload. Per una richiesta GET, il payload è una stringa vuota.

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

1. Combina tutti gli elementi per creare la richiesta canonica.

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

### Fase 2. Creazione della stringa da firmare.
<a name="create-urlsign"></a>

La stringa per la firma contiene le meta informazioni che interessano la richiesta. È possibile utilizzare la stringa per firmare il passaggio successivo quando si calcola la firma della richiesta. Per ulteriori informazioni, consulta [Creazione di una stringa da firmare per Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html) nei *Riferimenti generali di Amazon Web Services*.

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

### Task 3: calcolo della firma
<a name="calculate-signature"></a>

Si ricava una chiave di firma dalla chiave di accesso segreta di AWS. La chiave derivata è specifica per la data, il servizio e la Regione AWS per un maggior livello di protezione. È possibile utilizzare la chiave derivata per firmare la richiesta. Per ulteriori informazioni, consulta [ Calcola la firma per firma per Signature Version 4 di AWS](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html) nei *Riferimenti generali di Amazon Web Services*.

Il codice presuppone che sia stata implementata la funzione `GetSignatureKey` per ottenere una chiave di firma. Per ulteriori informazioni e funzioni di esempio, consulta [Esempi di come si ottiene una chiave di firma per Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html) nei *Riferimenti generali di Amazon Web Services*.

La funzione `HMAC(key, data)` rappresenta una funzione HMAC-SHA256 che restituisce i risultati in formato binario.

```
#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
```

### Processo 4: Aggiunta delle informazioni sulla firma per la richiesta e la creazione della richiesta URL
<a name="sign-request"></a>

Dopo aver calcolato la firma, aggiungerla alla stringa di query. Per ulteriori informazioni, consulta [Aggiungere la firma alla richiesta](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html) nei *Riferimenti generali di 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
```

## Passaggi successivi
<a name="network-analyzer-request-next"></a>

È possibile utilizzare l'URL della richiesta con la libreria WebSocket per effettuare la richiesta al servizio e osservare i messaggi. Per ulteriori informazioni, consultare [Messaggi WebSocket e codici di stato](network-analyer-messages-status.md).