

# Generar una solicitud prefirmada con la biblioteca WebSocket
<a name="network-analyzer-generate-request"></a>

A continuación, se muestra cómo generar una solicitud prefirmada con el fin de poder usar la biblioteca WebSocket para enviar solicitudes al servicio.

## Agregar una política para solicitudes de WebSocket a su rol de IAM
<a name="network-analyzer-iam"></a>

Si desea utilizar el protocolo WebSocket para llamar al analizador de redes, debe asociar la siguiente política al rol AWS Identity and Access Management de IAM que realiza la solicitud. 

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

## Crear una URL prefirmada
<a name="network-analyzer-presigned-url"></a>

Cree una URL para la solicitud de WebSocket que contenga la información necesaria para configurar la comunicación entre la aplicación y el analizador de redes. Para verificar la identidad de la solicitud, el streaming de WebSocket utiliza el proceso Signature Version 4 de Amazon para firmar solicitudes. Para obtener más información acerca de Signature Version 4, consulte [Firma de solicitudes de la API de AWS](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) en la *Referencia general de Amazon Web Services*.

Para llamar al analizador de redes, utilice la URL de solicitud `StartNetworkAnalyzerStream`. La solicitud se firmará con las credenciales del rol de IAM mencionado anteriormente. La URL tiene el siguiente formato con saltos de línea agregados para facilitar la lectura.

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

Utilice los siguientes valores para los parámetros de Signature Version 4:
+ **X-Amz-Algorithm**: el algoritmo que está utilizando en el proceso de firma. El único valor válido es `AWS4-HMAC-SHA256`.
+ **X-Amz-Credential**: una cadena separada por barras diagonales ("/") que se forma concatenando sus componentes de ID de clave de acceso y ámbito de credenciales. El ámbito de credenciales incluye la fecha con el formato AAAAMMDD, la región de AWS, el nombre del servicio, así como una cadena de terminación (aws4\$1request).
+ **X-Amz-Date**: la fecha y hora en que se creó la firma. Genere la fecha y la hora siguiendo las instrucciones de [Control de fechas en Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html) en la *Referencia general de Amazon Web Services*.
+ **X-Amz-Expires**: el tiempo en segundos que transcurre hasta que caduquen las credenciales. El valor máximo es de 300 segundos (5 minutos).
+ **X-Amz-Security-Token**: (opcional) un token de Signature Version 4 para credenciales temporales. Si especifica este parámetro, inclúyalo en la solicitud canónica. Para obtener más información, consulte [Solicitud de credenciales de seguridad temporales](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) en la *AWSGuía del usuario de Administración de identidades y accesos*.
+ **X-Amz-Signature**: la firma de Signature Version 4 que generó para la solicitud.
+ **X-AMZ-SignedHeaders**: los encabezados que se firman al crear la firma de la solicitud. El único valor válido es `host`.

## Construya la URL de la solicitud y cree la firma de Signature Version 4
<a name="connect-iot-network-analyzer-construct-url-sign"></a>

Para construir la URL de la solicitud y crear la firma de Signature Version 4, utilice los siguientes pasos. Los ejemplos están en pseudocódigo.

### Tarea 1: Crear una solicitud canónica
<a name="canonical-request"></a>

Cree una cadena que incluya información de su solicitud en un formato estandarizado. Esto garantiza que, cuando AWS reciba la solicitud, pueda calcular la misma firma que ha calculado en [Tarea 3: Calcular la firma](#calculate-signature). Para obtener más información, consulte [Creación de una solicitud canónica para Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html) en la *Referencia general de Amazon Web Services*.

1. Defina variables para la solicitud en su aplicación.

   ```
   # HTTP verb
   method = "GET"
   # Service name
   service = "iotwireless"
   # Región de AWS
   region = "Región de 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. Cree un URI canónico (identificador uniforme de recursos). El URI canónico es la parte del URI entre el dominio y la cadena de consulta.

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

1. Cree los encabezados canónicos y los encabezados firmados. Tenga en cuenta la `\n` final en los encabezados canónicos.
   + Agregue el nombre de encabezado en minúsculas seguido de un signo de dos puntos.
   + Agregue una lista de valores separados por comas para ese encabezado. No ordene los valores de los encabezados que tienen múltiples valores.
   + Agregue una nueva línea (`\n`).

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

1. Haga coincidir el algoritmo con el algoritmo de hash. Debe utilizar SHA-256.

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

1. Cree el ámbito de credenciales, que abarca la clave derivada de la fecha, la región y el servicio para el que se realiza la solicitud.

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

1. Cree la cadena de consulta canónica. Los valores de cadena de la consulta deben estar codificados en URI y ordenados por nombre.
   + Ordene los nombres de los parámetros en orden ascendente según el punto del código de caracteres. Los parámetros con nombres duplicados deben ordenarse por valor. Por ejemplo, un nombre de parámetro que comienza por la letra mayúscula F precede a un nombre de parámetro que empieza por la letra minúscula b.
   + No codifique según las normas de los URI ninguno de los caracteres no reservados definidos en la norma [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986): A-Z, a-z, 0-9, guion (-), guion bajo (\$1), punto (. ) y tilde ( \$1 ).
   + Codifique con signos de porcentaje el resto de los caracteres con %XY, donde X e Y son caracteres hexadecimales (0-9 y A-F mayúsculas). Por ejemplo, el carácter de espacio debe codificarse como %20 (no mediante el signo “\$1” como en algunos esquemas de codificación) y los caracteres extendidos UTF-8 deben indicarse con el formato %XY%ZA%BC.
   + Codifique dos veces los caracteres de equivalencia (=) en los valores de los parámetros.

   ```
   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. Cree un hash de la carga. Para una solicitud GET, la carga es una cadena vacía.

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

1. Combine todos los elementos para crear la solicitud canónica.

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

### Tarea 2: Crear la cadena para firmar
<a name="create-urlsign"></a>

La cadena para firmar contiene metainformación sobre su solicitud. Puede utilizar la cadena para firmar en el siguiente paso cuando calcule la firma de la solicitud. Para obtener más información, consulte [Crear una cadena para firmar de Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html) en la *Referencia general de Amazon Web Services*.

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

### Tarea 3: Calcular la firma
<a name="calculate-signature"></a>

Genere una clave de firma a partir de la clave de acceso secreta de AWS. Para un mayor grado de protección, la clave derivada es específica de la fecha, el servicio y la región de AWS. Utilice la clave derivada para firmar la solicitud. Para obtener más información, consulte [Calcular la firma para AWS Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html) en la *Referencia general de Amazon Web Services*.

El código se supone que ha implementado la función `GetSignatureKey` para generar una clave de firma. Para obtener más información y funciones de ejemplo, consulte [Ejemplos de cómo generar una clave de firma para Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html) en la *Referencia general de Amazon Web Services*.

La función `HMAC(key, data)` representa una función HMAC-SHA256 que devuelve los resultados en 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
```

### Tarea 4: Agregar información de firma a la solicitud y crear la URL de la solicitud
<a name="sign-request"></a>

Después de calcular la firma, agréguesela a la cadena de la solicitud. Para obtener más información, consulte [Agregar la firma a la solicitud de la API](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html) en la *Referencia general de 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
```

## Siguientes pasos
<a name="network-analyzer-request-next"></a>

Puede utilizar la URL de la solicitud con su biblioteca de WebSocket para realizar la solicitud al servicio y observar los mensajes. Para obtener más información, consulte [Mensajes y códigos de estado de WebSocket](network-analyer-messages-status.md).