0

Je dois donner des clés d'accès temporaires à mes clients pour me connecter aux services IoT (publication, réception, etc.). Pour fournir cet accès, j'ai créé une fonction Lambda qui appelle sts.assumeRole pour créer des clés STS temporaires. Ces clés sont en cours de création et ont l'air bien.Impossible d'utiliser les informations d'identification temporaires AWS (STS) - interdites

J'utilise assumeRole avec Lambda dans un rôle à la politique en ligne suivante:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Action": [ 
       "iot:Connect", 
       "iot:Subscribe", 
       "iot:Publish", 
       "iot:Receive" 
      ], 
      "Resource": "*", 
      "Effect": "Allow" 
     }, 
     { 
      "Action": [ 
       "ec2:*" 
      ], 
      "Resource": "*", 
      "Effect": "Allow" 
     }, 
     { 
      "Action": [ 
       "sts:AssumeRole" 
      ], 
      "Resource": "*", 
      "Effect": "Allow" 
     } 
    ] 
} 

Note: J'ai ajouté des autorisations EC2 pour essayer un test secondaire (simplifié).

Ce rôle a une relation de confiance ouverte:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "sts:AssumeRole" 
    } 
    ] 
} 

Cependant, dans mon code client (navigateur), je ne peux pas se connecter à IdO et je reçois l'erreur suivante:

WebSocket connection to 'wss://my-endpoint.iot.us-east-1.amazonaws.com/mqtt?X-Amz-Algorithm=AWS4-H…Signature=my-signature' failed: Error during WebSocket handshake: Unexpected response code: 403

En essayant un test simplifié, j'ai utilisé EC2, mais j'ai reçu une autre erreur d'autorisation. Le code utilisé ci-dessous (navigateur utilisé pour regrouper dans parcourir).

const AWS = require('aws-sdk'); 

// connect to Lambda to retrieve accessKeyId and secretAccessKey 
$.ajax({ 
    method: 'GET', 
    url: 'my-url', 
    success: function(res) { 

     // connect to EC2 
     AWS.config.update({accessKeyId: res.accessKeyId, secretAccessKey: res.secretAccessKey, region: res.region}); 
     const ec2 = new AWS.EC2(); 

     ec2.describeInstances({}, function(err, data) { 
      if (err) console.log(err, err.stack); // an error occurred 
      else  console.log(data);   // successful response 
     }); 
    }); 

Erreur:

POST https://ec2.us-east-1.amazonaws.com/ 401 (Unauthorized)

Error: AWS was not able to validate the provided access credentials(…) "AuthFailure: AWS was not able to validate the provided access credentials"

Répondre

1

Trouvé l'erreur. Lors de la connexion avec le client, j'ai besoin de fournir le sessionToken créé par la fonction assortie.

Code client:

// connect to EC2 
AWS.config.update({accessKeyId: res.accessKeyId, secretAccessKey: res.secretAccessKey, sessionToken: res.sessionToken, region: res.region}); 
const ec2 = new AWS.EC2(); 

ec2.describeInstances({}, function(err, data) { 
    if (err) console.log(err, err.stack); // an error occurred 
    else  console.log(data);   // successful response 
});