0

bâtiment Im un service + client en utilisant les technologies Amazon suivantes:premier appel à AWS_IAM point final API sécurisé est toujours non autorisée

  1. Lambda
  2. S3
  3. passerelle API
  4. Cognito
  5. fédérée Identités

Im utilisant le cadre sans serveur travailler pour construire et déployer l'API. Le client est une application angulaire 1 hébergée dans un compartiment S3. Le point de terminaison API est sécurisé à l'aide d'AWS_IAM, le problème est que le premier appel à l'API de mon client JS est non autorisé, tous les appels après (qui utilisent les mêmes informations d'identification) sont autorisés. Je peux voir dans mon journal que

var accessKeyId = AWS.config.credentials.accessKeyId; 
var secretAccessKey = AWS.config.credentials.secretAccessKey; 
var sessionToken = AWS.config.credentials.sessionToken; 

est indéfini la première fois que je fais l'appel.

Ce que j'espère réaliser est de récupérer les informations d'identification nécessaires afin que le premier appel réussisse.

Le code ci-dessous est ce qui est utilisé pour obtenir les informations d'identification d'Amazon Cognito et appeler l'API. J'utilise le SDK javascript généré depuis AWS API Gateway pour signer la demande et appeler l'API.

 var authenticationDetails = new AWSCognito 
      .CognitoIdentityServiceProvider 
      .AuthenticationDetails(authenticationData); 

     var deferred = $q.defer(); 

     cognitoUser.authenticateUser(authenticationDetails, { 
      onSuccess: function (result) { 

       var logins = {} 
       logins["cognito url" + "/" + "cognito pool id"] = result.idToken.jwtToken 
       AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
        IdentityPoolId: "identity pool id", 
        Logins: logins 
       }); 



       AWS 
        .config 
        .credentials 
        .get(function() { 

         var accessKeyId = AWS.config.credentials.accessKeyId; 
         var secretAccessKey = AWS.config.credentials.secretAccessKey; 
         var sessionToken = AWS.config.credentials.sessionToken; 

         var config = { 
          accessKey: accessKeyId, 
          secretKey: secretAccessKey, 
          sessionToken: sessionToken 


         } 

         var apigClient = apigClientFactory.newClient(config); 


         apigClient 
          .endpointName(params, body, additionalParams) 
          .then(function (result) { 

          deferred.resolve(true) 


          }) 
          .catch(function (result) { 
           deferred.resolve(false) 

          }); 

        }); 

      }, 

      onFailure: function (err) { 
       alert(err); 
      } 
     }); 

     return deferred.promise; 

    } 
} 
+0

Je pense que aws.config.cred.get ((err) qui fonctionnent le premier paramètre est l'erreur ... vous devriez vérifier s'il y a un message d'erreur là. .. – UXDart

Répondre

0

Le problème est que je ne pas actualiser les informations d'identification après la récupération. Pour référence plus le code utilisé est ci-dessous:

 AWS.config.credentials.get(function() { 

      AWS.config.credentials.refresh(function(error) { 
      if (error) { 
       console.log(error); 

       // rejects promise with error message 
      } else { 

       var accessKeyId = AWS.config.credentials.accessKeyId; 
       var secretAccessKey = AWS.config.credentials.secretAccessKey; 
       var sessionToken = AWS.config.credentials.sessionToken; 

       console.log(accessKeyId); 
       console.log(secretAccessKey); 
       console.log(sessionToken); 

      } 
      }); 

     });