在浏览器(javascript)中将Cognito凭据与AWS一起使用时,请不断获取;“缺少凭据”;错误

在浏览器(javascript)中将Cognito凭据与AWS一起使用时,请不断获取;“缺少凭据”;错误,javascript,amazon-web-services,amazon-s3,amazon-cognito,aws-sdk,Javascript,Amazon Web Services,Amazon S3,Amazon Cognito,Aws Sdk,我正在尝试使用AWS的JavaScript SDK从web浏览器向我的S3存储桶上传一个文件。我的代码如下所示: AWS.config.credentials = new AWS.CognitoIdentityCredentials({ AccountId: 'dfhgdh', IdentityPoolId: 'fdagsd', RoleArn: 'fdafds' }); var bucket = new AWS.S3({params: {Bucket: 'test-b

我正在尝试使用AWS的JavaScript SDK从web浏览器向我的S3存储桶上传一个文件。我的代码如下所示:

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…”


我确信我在这里遗漏了一些简单而愚蠢的东西,但我不知道这会给我的生活带来什么。(当我试图硬编码一个伪造的密钥或其他东西时,我会遇到一个不同的错误,所以我很确定这与我试图设置cognito凭据的方式有关。)

配置凭据对象后,您需要通过调用
refresh()
来调用以获取这些凭据。然后,您可以在回调中调用S3

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

AWS.config.credentials.refresh(function(){
   // Your S3 code here...
});

在调试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'
    })
});

你能包括你收到的错误消息的全部内容吗?CredentialsError似乎被切断了。通过js使用upload安全吗?我的意思是我们正在公开这些凭据?还是足够安全?有两件事仍然允许安全下载:1)你应该在S3上配置你的设置,只允许上传和下载请求2)客户端必须知道文件名才能读取文件。因此,在上载文件时,您可以使用14或15个字符的随机字母数字字符串作为文件夹名,以确保唯一性,并且几乎不可能猜出文件名。好的,点号很有意义。谢谢。这是我想要的URLfound trello使用了…这是相同的方法吗?看起来是这样。但是,我不记得没有目录时s3 URL是什么样子。所以我不确定。