首次调用安全 API 端点AWS_IAM始终未经授权



我使用以下 Amazon 技术构建服务 + 客户端:

  1. 拉姆达
  2. S3
  3. 接口网关
  4. 认知
  5. 联合身份

我使用无服务器框架来构建和部署 API。 客户端是托管在 S3 存储桶中的 angular 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。我使用从 AWS API Gateway 生成的 JavaScript 开发工具包对请求进行签名并调用 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;
}
}

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

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

最新更新