Неавторизованный доступ к сервисам AWS с помощью Cognito

Я пытаюсь написать простой JavaScript (работающий в браузере), который будет получать информацию о моих приложениях Beanstalk с помощью функции descriptionApplications. Я создал 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);
        }
    });

Here is the output in console:

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

And voila, I see my beanstalk applications:

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

Я сделал другие тесты. Я попытался перечислить ведра S3 с помощью unauth. доступ и Cognito - тоже работает. Это означает мою неавторизацию. роль правильно прикреплена и применена. Но я понятия не имею, почему я не вижу приложений в 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

            }
        });        
    }
});

person Georgy Nemtsov    schedule 17.10.2017    source источник
comment
Как выглядит ваша IAM-политика для этой роли? Похоже, вам может не хватать подстановочного знака где-то в вашем Resource.   -  person arjabbar    schedule 17.10.2017
comment
Это политика AWS по умолчанию AWSElasticBeanstalkReadOnlyAccess с ресурсом: *. Прикреплена та же политика для тестового пользователя и роли cognito.   -  person Georgy Nemtsov    schedule 17.10.2017
comment
Тот факт, что вы видите ответ, хотя и с пустым массивом, для меня является признаком того, что он работает. В противном случае вы увидите исключение. Дважды и трижды проверить регион?   -  person jarmod    schedule 17.10.2017
comment
Да, тройная проверка. Я только меняю учетные данные в сценарии на жестко запрограммированные, и это показывает мое приложение.   -  person Georgy Nemtsov    schedule 17.10.2017


Ответы (1)


Я не уверен, что вы делаете что-то не так; Я также не смог выполнить эту работу. Я подозреваю, что вы можете стать жертвой Amazon, «защищающего» вас от самого себя.

Из http://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html в разделе «Политики доступа»:

В целях дополнительной защиты Amazon Cognito применяет к учетным данным, предоставленным GetCredentialForIdentity, политику ограничения области действия, чтобы предотвратить доступ к другим службам для неаутентифицированных пользователей:

... список сервисов, в которые НЕ входит Elastic Beanstalk ...

Если вам нужен доступ к чему-либо, кроме этих служб, для пользователей, не прошедших проверку подлинности, вы должны использовать процесс базовой проверки подлинности.

Похоже, это говорит о том, что независимо от того, какие политики вы прикрепите к своей роли Cognito Unauthenticated, AWS собирается «уменьшить ее масштаб».

Если это так, вам хотелось бы увидеть какие-либо доказательства наличия NotAuthorizedException (часто в заголовке ответа), но я ничего не нашел.

person Mike Patrick    schedule 18.10.2017