我正在尝试编写一个简单的JavaScript(在浏览器中运行),它将使用describeApplications函数获取有关我的Beanstalk应用程序的信息。我创建了Cognito Identity Pool,其中包含未经身份验证的访问复选框,并将AWSElasticBeanstalkReadOnlyAccess策略附加到Identity Pool的角色。
以下是代码:
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.134.0.min.js"></script>
<script>
AWS.config.region = 'eu-west-1'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'eu-west-1:....',
});
var elasticbeanstalk = new AWS.ElasticBeanstalk();
elasticbeanstalk.describeApplications({}, function (err, data) {
if (err) {
console.log(err);
console.log(err.stack);
} else {
console.log(data);
}
});
以下是控制台中的输出:
{ResponseMetadata: {…}, Applications: Array(0)}
应用程序数组为空!但我肯定在eu-west-1地区有应用。
为了进行简单的测试,我创建了一个用户,附加了相同的策略和硬编码的用户凭据,而不是CognitoIdentityCredentials:
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.134.0.min.js"></script>
<script>
AWS.config.region = 'eu-west-1'; // Region
AWS.config.accessKeyId = '...';
AWS.config.secretAccessKey = '...';
var elasticbeanstalk = new AWS.ElasticBeanstalk();
elasticbeanstalk.describeApplications({}, function (err, data) {
if (err) {
console.log(err);
console.log(err.stack);
} else {
console.log(data);
}
});
瞧,我看到了我的beanstalk应用程序:
{ResponseMetadata: {…}, Applications: Array(1)}
我做过其他测试。我试图用unauth列出S3存储桶。访问和Cognito - 它也有效。这意味着我的不道德。角色已正确附加和应用。但我不知道,为什么我在beanstalk中看不到任何应用程序!
我对未经身份验证的访问和Cognito做错了什么?任何帮助将非常感谢!
更新!
感谢Mike Patrick指出了正确的方向! https://stackoverflow.com/a/46820122/1858818
我切换到基本身份验证流程就是这样。这是代码的工作原理:
AWS.config = {
apiVersions: { elasticbeanstalk: '2010-12-01' },
region: 'eu-west-1',
credentials: new AWS.WebIdentityCredentials({
RoleArn: 'my role arn'
})
};
var cognitoidentity = new AWS.CognitoIdentity(),
elasticbeanstalk = new AWS.ElasticBeanstalk();
var params = {
IdentityPoolId: 'my cognito identity pool id', /* required */
};
cognitoidentity.getId(params, function(err, data) {
if (err){
console.log(err, err.stack); // an error occurred
} else {
var params = {
IdentityId: data.IdentityId
};
cognitoidentity.getOpenIdToken(params, function(err, data) {
if (err) {
console.log(err, err.stack); // an error occurred
} else {
AWS.config.credentials.params.WebIdentityToken = data.Token;
//here we go, elasticbeanstalk functions work as expected
}
});
}
});
答案 0 :(得分:2)
我不相信你做错了什么;我也无法完成这项工作。我怀疑你可能是亚马逊“保护”你自己的受害者。
来自“访问政策”下的http://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html:
为了获得额外的安全保护,Amazon Cognito会应用 范围向下政策,由GetCredentialForIdentity提供给凭证 阻止您对未经身份验证的服务进行访问 用户:
...不包含Elastic Beanstalk的服务列表...
如果您需要访问除此类服务之外的其他内容 未经身份验证的用户,必须使用基本身份验证流程。
这似乎表明,无论您将哪些政策附加到Cognito未经身份验证的角色,AWS都会“将其范围缩小”。
如果是这种情况,你喜欢看一些NotAuthorizedException
的证据(通常在响应标题中),但我找不到任何证据。