使用Cognito对AWS服务的未经身份验证的访问
我正在尝试编写一个简单的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
}
});
}
});
我不相信你做错了什么;我也无法完成这项工作。我怀疑你可能是亚马逊“保护”自己的受害者。
从http://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html下“访问策略”:
对于额外的安全保护,亚马逊Cognito施加 范围下乡政策由GetCredentialForIdentity贩卖凭据 防止对未经认证的访问除这些其他服务 用户:
...服务清单不包括青苗弹性...
如果您需要为您的 未经身份验证的用户访问除这些服务以外的其他内容,则必须使用基本身份验证流程。
这似乎表明,无论您将哪种策略附加到Cognito Unauthenticated角色,AWS都会“缩小范围”。
如果是这种情况,你会像看到一些NotAuthorizedException
(通常在响应标题)的证据,但我找不到任何。
您对该角色的IAM策略是什么样的?看起来你可能在'Resource'的某处丢失了一个通配符。 – arjabbar
这是缺省AWS策略AWSElasticBeanstalkReadOnlyAccess,其中“Resource”为“*”。为测试用户和认证角色附加相同的策略。 –
事实上,你看到一个响应,尽管它有一个空的数组,这是一个迹象表明它正在工作。否则,你会看到一个异常。双重和三重检查区域? – jarmod