1

我正在尝试编写一个简单的 JavaScript(在浏览器中运行),它将通过 describeApplications 函数获取有关我的 Beanstalk 应用程序的信息。我创建了带有未经身份验证的访问复选框的 Cognito 身份池,并将 AWSElasticBeanstalkReadOnlyAccess 策略附加到身份池的角色。

这是代码:

<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 存储桶。访问和认知 - 它也有效。这意味着我的未授权。角色被正确附加和应用。但我不知道,为什么我在 beanstalk 中看不到任何应用程序!

我在未经身份验证的访问和 Cognito 上做错了什么?任何帮助将不胜感激!

更新!

感谢迈克帕特里克指出正确的方向!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

            }
        });        
    }
});
4

1 回答 1

3

我不相信你做错了什么;我也无法完成这项工作。我怀疑您可能是亚马逊“保护”您免受自己伤害的受害者。

来自“访问策略”下的http://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html :

为了获得额外的安全保护,Amazon Cognito 将范围缩小策略应用于 GetCredentialForIdentity 提供的凭证,以 防止未经身份验证的用户访问这些服务以外的服务

... 不包括 Elastic Beanstalk 的服务列表 ...

如果您需要为未经身份验证的用户访问这些服务以外的其他内容,则必须使用基本身份验证流程。

这似乎表明,无论您将什么策略附加到您的 Cognito Unauthenticated 角色,AWS 都会“缩小范围”。

如果是这种情况,您希望看到a 的一些证据NotAuthorizedException(通常在响应标头中),但我找不到任何证据。

于 2017-10-18T22:19:19.233 回答