s3预签名url Javascript代码未返回完整url



我正在尝试为s3存储桶中的文件生成预签名的url,这样我的网站用户就不会有到实际文件的链接。我一直在尝试使用以下代码:

const AWS = require('aws-sdk');
const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'AKIAVXSBEXAMPLE', secretAccessKey: 'EXAMPLE5ig8MDGZD8p8iTj7t3KEXAMPLE'})
// Tried with and without this. Since s3 is not region-specific, I don't
// think it should be necessary.
AWS.config.update({region: 'eu-west-2'})
const myBucket = 'bucketexample'
const myKey = 'example.png'
const signedUrlExpireSeconds = 60 * 5
const url = s3.getSignedUrl('getObject', {
Bucket: myBucket,
Key: myKey,
Expires: signedUrlExpireSeconds
})
setTimeout(function(){ console.log("url", url); }, 3000);
console.log("url:", url)

然而,它所返回的是:;https://s3.amazonaws.com/">

我也尝试过使用这个代码:

const AWS = require('aws-sdk');
var s3 = new AWS.S3();
var params = {Bucket: 'bucketexample', Key: 'example.png'};
s3.getSignedUrl('putObject', params, function (err, url) {
console.log('The URL is', url);
});

它不会返回任何内容。有人知道他们为什么不返回工作URL吗?

我也遇到过类似的问题。当AWS SDK返回https://s3.amazonaws.com/这是因为机器没有适当的权限。这可能会令人沮丧,我认为AWS应该返回一条描述性错误消息,而不仅仅是返回错误的url。

我建议您为您的机器配置AWS凭据,或在AWS中赋予它一个角色。尽管您应该能够像在代码片段中那样通过代码输入凭据,但无论出于何种原因,这对我来说都不起作用。

对我有效的是更新我机器的默认AWS凭据或为部署的服务器添加适当的角色。

我遇到了类似的问题,我得到了不完整的签名URL,就像我使用时一样

let url = await s3.getSignedUrl("getObject", {
Bucket: bucket,
Key: s3FileLocation,
Expires: ttlInSeconds,
});

然后我使用了Promise函数:

// I used it inside an async function
let url = await s3.getSignedUrlPromise("getObject", {
Bucket: bucket,
Key: s3FileLocation,
Expires: ttlInSeconds,
});

它返回了完整的签名URL。

注意:

如果您在尝试使用已签名的URL访问对象时收到此消息。

<Error>
<Code>InvalidArgument</Code>
<Message>Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.</Message>

然后在初始化s3:时使用此选项

const s3 = new AWS.S3({"signatureVersion":"v4"});

最新更新