При использовании учетных данных Cognito с AWS в браузере (javascript) постоянно появляется ошибка отсутствия учетных данных

Я пытаюсь загрузить файл в свою корзину S3 из веб-браузера с помощью AWS JavaScript SDK. Мой код выглядит так:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    AccountId: 'dfhgdh',
    IdentityPoolId: 'fdagsd',
    RoleArn: 'fdafds'
});

var bucket = new AWS.S3({params: {Bucket: 'test-bucket'}});
var pdfUpload = document.getElementById('pdf-uploads').files[0];

var params = {Key: pdfUpload.name, ContentType: pdfUpload.type, Body: pdfUpload};
bucket.putObject(params, function (error, data) {
    if (error) {
        console.log(error);
    } else {
        console.log(data);
    }
});

Однако всякий раз, когда он достигает команды putObject, я все время получаю сообщение об ошибке от AWS:

"Ошибка: учетные данные отсутствуют в конфигурации {сообщение:" Отсутствуют учетные данные в конфигурации ", код:" CredentialsError "..."

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


person RocketGuy3    schedule 16.12.2014    source источник
comment
Можете ли вы включить полное содержание полученного сообщения об ошибке? CredentialsError кажется отключенным.   -  person Bob Kinney    schedule 18.12.2014


Ответы (2)


Оказалось, что после отладки JavaScript AWS SDK проблема заключалась в том, что я не устанавливал регион перед установкой учетных данных ... И по какой-то причине мне также нужно использовать метод обновления. Я думаю, что это похоже на ошибку в SDK, но следующая настройка AWS.config устранила мою проблему:

AWS.config.region = 'us-east-1';
AWS.config.update({
    credentials: new AWS.CognitoIdentityCredentials({
        AccountId: '43243243243',
        RoleArn: 'arn:aws:iam::970123460807:role/Cognito_RigUpWebUnauth_DefaultRole',
        IdentityPoolId: 'us-east-1:432432-432432432-4324323423-423243'
    })
});
person RocketGuy3    schedule 22.12.2014
comment
Безопасно ли использовать загрузку через js, я имею в виду, что мы раскрываем эти учетные данные? Или это достаточно безопасно? - person cafebabe1991; 15.10.2015
comment
Есть две вещи, которые по-прежнему обеспечивают безопасную загрузку: 1) Вы должны настроить свои параметры на S3, чтобы разрешить загрузку и загрузку запросов только с URL-адреса вашего сайта. 2) Клиент должен знать имя файла, чтобы его прочитать. Таким образом, при загрузке файла вы можете использовать случайную буквенно-цифровую строку из 14 или 15 символов в качестве имени папки, чтобы гарантировать уникальность и сделать практически невозможным угадать имя файла. - person RocketGuy3; 15.10.2015
comment
Хорошо, номер пункта действительно имеет смысл .. Спасибо. Вот URL-адрес, который, как я обнаружил, использует Trello ... attachments.s3.amazonaws.com/55d37fa3bdcb50239ec4bdef/ .. Это тот же подход? - person cafebabe1991; 15.10.2015
comment
Казалось бы, да. Однако я не помню, как выглядит URL-адрес s3, когда нет каталога. Так что я не уверен. - person RocketGuy3; 15.10.2015

После настройки объекта учетных данных вам нужно будет позвонить, чтобы получить эти учетные данные, вызвав refresh(). Затем вы можете поместить свой вызов на S3 внутри обратного вызова.

AWS.config.credentials = new AWS.CognitoIdentityCredentials({...});

AWS.config.credentials.refresh(function(){
   // Your S3 code here...
});
person Mike Murry    schedule 19.12.2014