使用Cognito对AWS服务进行未经身份验证的访问

时间:2017-10-17 13:18:43

标签: amazon-web-services aws-cognito aws-sdk-js

我正在尝试编写一个简单的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

            }
        });        
    }
});

1 个答案:

答案 0 :(得分:2)

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

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

  

为了获得额外的安全保护,Amazon Cognito会应用   范围向下政策,由GetCredentialForIdentity提供给凭证   阻止您对未经身份验证的服务进行访问   用户

     

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

     

如果您需要访问除此类服务之外的其他内容   未经身份验证的用户,必须使用基本身份验证流程。

这似乎表明,无论您将哪些政策附加到Cognito未经身份验证的角色,AWS都会“将其范围缩小”。

如果是这种情况,你喜欢看一些NotAuthorizedException的证据(通常在响应标题中),但我找不到任何证据。