2017-10-17 206 views
1

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

下面是代码:

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

应用阵列是空的!但我在欧盟西部地区肯定有应用。

为了做一个简单的测试,我创建了一个用户,附着相同的策略和硬编码的用户凭据,而不是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); 
     } 
    }); 

瞧,我看到我的魔豆的应用:

{ResponseMetadata: {…}, Applications: Array(1)} 

我做过其他测试。我试图列出S3 bucket with unauth。访问和Cognito - 它也可以。这意味着我的不道德。角色被正确地附加和应用。但我不知道,为什么我看不到豆荚里的应用程序!

我在做什么错误的未经认证的访问和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

您对该角色的IAM策略是什么样的?看起来你可能在'Resource'的某处丢失了一个通配符。 – arjabbar

+0

这是缺省AWS策略AWSElasticBeanstalkReadOnlyAccess,其中“Resource”为“*”。为测试用户和认证角色附加相同的策略。 –

+0

事实上,你看到一个响应,尽管它有一个空的数组,这是一个迹象表明它正在工作。否则,你会看到一个异常。双重和三重检查区域? – jarmod

回答

1

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

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

对于额外的安全保护,亚马逊Cognito施加 范围下乡政策由GetCredentialForIdentity贩卖凭据 防止对未经认证的访问除这些其他服务 用户

...服务清单不包括青苗弹性...

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

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

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

相关问题