Générer une demande présignée avec la bibliothèque WebSocket - AWS IoT Wireless

Générer une demande présignée avec la bibliothèque WebSocket

La présente rubrique explique comment générer une demande présignée afin de pouvoir utiliser la bibliothèque WebSocket pour envoyer des demandes au service.

Ajout d’une politique pour les demandes WebSocket à votre rôle IAM

Pour utiliser le protocole WebSocket pour appeler l’analyseur de réseau, vous devez joindre la politique suivante au rôle (IAM) AWS Identity and Access Management qui effectue la demande.

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

Créer une URL présignée

Construisez une URL pour votre demande WebSocket qui contient les informations requises pour configurer la communication entre votre application et l’analyseur de réseau. Pour vérifier l’identité de la demande, le streaming WebSocket utilise le processus Amazon Signature Version 4 pour signer les demandes. Pour en savoir plus sur Signature Version 4, consultez Signature AWS des demandes d’API dans Amazon Web Services General Reference.

Pour appeler l’analyseur de réseau, utilisez l’URL de la demande StartNetworkAnalyzerStream. La demande sera signée à l’aide des informations d’identification du rôle IAM mentionnées précédemment. L’URL a le format suivant, avec des sauts de ligne ajoutés pour plus de lisibilité.

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

Utilisez les valeurs suivantes pour les paramètres de Signature Version 4 :

  • X-Amz-Algorithm – Algorithme que vous utilisez lors du processus de signature. La seule valeur valide est AWS4-HMAC-SHA256.

  • X-Amz-Credential Chaîne séparée par des barres obliques (« / ») et formée en concaténant votre ID de clé d’accès et les composants de vos informations d’identification. La portée des informations d’identification inclut la date au format AAAAMMJJ, la région AWS, le nom du service et une chaîne de terminaison (aws4_request).

  • X-Amz-Date — La date et l’heure de création de la signature. Génère la date et l’heure en suivant les instructions dans Gestion des dates dans Signature Version 4 dans Amazon Web Services General Reference.

  • X-Amz-Expires Durée en secondes jusqu’à ce que les informations d’identification arrivent à expiration. La valeur maximale est de 300 secondes (5 minutes).

  • X-Amz-Security-Token Jeton Signature Version 4 pour les informations d’identification temporaires. Si vous spécifiez ce paramètre, incluez-le dans la requête canonique. Pour plus d’informations, consultez Demande d’identifiants de sécurité temporaires dans le AWS Manuel de l’utilisateur Identity and Access Management.

  • X-Amz-Signature – Signature Signature Version 4 que vous avez générée pour la demande.

  • X-Amz-SignedHeaders En-têtes signés lors de la création de la signature de la demande. La seule valeur valide est host.

Construisez l’URL de demande et créez une signature Signature Version 4

Pour construire l’URL de la demande et créer la signature Signature Version 4, utilisez les étapes suivantes. Les exemples sont en pseudo-code.

Créez une chaîne qui inclut des informations de votre demande dans un format normalisé. Ainsi, lorsque AWS reçoit la demande, il peut calculer la même signature que celle que vous avez calculée dans Tâche 3 : calculer la signature. Pour plus d’informations, consultez Créer une demande canonique pour Signature Version 4 dans Amazon Web Services General Reference.

  1. Définissez des variables pour la demande dans votre application.

    # HTTP verb method = "GET" # Service name service = "iotwireless" # Région AWS region = "Région 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
  2. Créez un URI canonique (identifiant de ressource uniforme). L’URI canonique est la partie de l’URI entre le domaine et la chaîne de requête.

    canonical_uri = "/start-network-analyzer-stream"
  3. Créez les en-têtes canoniques et les en-têtes signés. Notez la barre oblique \n dans les en-têtes canoniques.

    • Ajoutez le nom d’en-tête en minuscules suivi de deux points.

    • Ajoutez une liste de valeurs séparées par des virgules pour cet en-tête. Ne triez pas les valeurs dans les en-têtes ayant plusieurs valeurs.

    • Ajoutez une nouvelle ligne (\n).

    canonical_headers = "host:" + host + "\n" signed_headers = "host"
  4. Associez l’algorithme à l’algorithme de hachage. Vous devez utiliser SHA-256.

    algorithm = "AWS4-HMAC-SHA256"
  5. Créez la portée des informations d’identification qui déterminera la clé dérivée de la date, de la région et du service auquel la demande est adressée.

    credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
  6. Créez la chaîne de requête canonique. Les valeurs des chaîne de requête doivent être encodées en URI et triées par nom.

    • Triez les noms de paramètre selon le point de code de caractère dans l’ordre croissant. Les paramètres avec des noms en double doivent être triés par valeur. Par exemple, un nom de paramètre qui commence par la lettre majuscule F précède un nom de paramètre qui commence par la lettre minuscule b.

    • N’encodez pas de l’URI les caractères autorisés que RFC 3986 définit : A à Z, a à z, 0 à 9, le trait d’union ( - ), le trait de soulignement ( _ ), le point final ( . ) et le tilde ( ~ ).

    • Encodez de pourcentage tous les autres caractères avec %XY, où X et Y représentent les caractères hexadécimaux (0 à 9 et les lettres majuscules A à F). Par exemple, le caractère espace doit être encodé sous la forme %20 (sans utiliser « + », comme le font certains schémas d’encodage) et les caractères UTF-8 étendus doivent être sous la forme %XY%ZA%BC.

    • Encodez deux fois tous les caractères égaux à (=) dans les valeurs de paramètre.

    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"
  7. Créez un hachage de la charge utile. Pour une demande GET, la charge utile est une chaîne vide.

    payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
  8. Combinez tous les éléments pour créer la demande canonique.

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

La chaîne à signer inclut les informations des métadonnées sur votre demande. Vous utilisez la chaîne à signer dans l’étape suivante lorsque vous calculez la signature de la demande. Pour plus d’informations, consultez la section Créer une chaîne de connexion pour Signature Version 4 dans la Référence générale d’Amazon Web Services

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

Dérivez une clé de signature de votre clé d’accès secrète AWS. La clé dérivée est spécifique à la date, au service et à la région AWS, pour un niveau de protection plus élevé. Vous utilisez la clé dérivée pour signer la demande. Pour en savoir plus, consultez Calculer la signature pour AWS la Version 4 dans la Référence générale d’Amazon Web Services.

Le code suppose que vous avez mis en œuvre la fonction, GetSignatureKey, pour dériver une clé de signature. Pour plus d’informations et des exemples de fonctions, consultez Exemples de dérivation d’une clé de signature pour Signature Version 4 dans la Référence générale d’Amazon Web Services.

La fonction HMAC(key, data) représente une fonction HMAC-SHA256 qui renvoie les résultats au format binaire.

#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

Une fois que vous avez calculé la signature, vous l’ajoutez à la chaîne de requête. Pour en savoir plus, veuillez consulter Ajouter la signature à la demande dans la Référence générale d’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

Étapes suivantes

Vous pouvez utiliser l’URL de la demande avec votre bibliothèque WebSocket pour effectuer la demande au service et observer les messages. Pour en savoir plus, consultez Messages et codes d’état WebSocket.