0

林建设使用服务+客户端以下的亚马逊技术:第一次调用AWS_IAM担保API端点总是擅自

  1. LAMBDA
  2. S3
  3. API网关
  4. Cognito
  5. 联合身份

使用无服务器框架致力于构建和部署API。 客户端是在S3存储桶中托管的角度为1的应用程序。

API端点使用AWS_IAM进行保护,问题是从我的JS客户端对API的第一次调用是未授权的,之后的每个调用(使用相同的凭据)都将被授权。我可以在我的日志中看到

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

未定义我第一次打电话。

我希望实现的是获取所需的凭据,以便第一次调用成功。

下面的代码是用来从Amazon Cognito获取凭据并调用API的。 Im使用AWS API网关生成的JavaScript SDK对请求进行签名并调用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

我认为aws.config.cred.get((ERR),该函数第一个参数是错误...你应该检查是否有任何错误信息出现。 .. – UXDart

回答

0

问题是我没有在检索后刷新凭证。为了进一步参考使用的代码如下:

 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); 

      } 
      }); 

     }); 
相关问题