AWS S3 getSignedUrl()返回Expired SignedURLs

时间:2016-05-09 07:00:27

标签: javascript node.js amazon-s3 amazon-ec2 mean-stack

ajax上运行良好,但在服务器上运行正常。返回的所有网址都已已过期

localhost

<Error> <Code>AccessDenied</Code> <Message>Request has expired</Message> <Expires>2016-04-26T09:44:22Z</Expires><ServerTime>2016-04-26T11:34:36Z</ServerTime><RequestId>33AF4E321F37ADA6</RequestId><HostId>+AXA3itXG9aKlt+EQkYxTHJCsxkEkymj+o2COPYo4+v26Vaxx17j/agh+hCq5NoHNzvJp2GI8Y=</HostId> </Error> 上,为同一对象生成的URL在localhost参数中有所不同,但在服务器上则不同。为服务器上的同一对象返回相同的URL(expires param每次都相同)。

服务器是Amazon EC2。凭据保存在expires和服务器

上的/.aws/credentials文件中

模型中的代码

localhost

在S3上编辑了CORS配置

var AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.download = function (req, res) {

    var fileName = req.params.name;

    var key = req.user._id + '/' + fileName;

    var params = { Bucket: 'myBucket', Key: key };

    s3.getSignedUrl('getObject', params, function (err, url) {

        if (err) {
            console.log('Getting Signed URL', err);
            res.send(err);
        } else {
            console.log('Getting Signed URL', url);
            res.send(url);            
        }
    });
};

2 个答案:

答案 0 :(得分:1)

...
// here you need to provide signed URL expiration time as the 3rd parameter
var params = { Bucket: 'myBucket', Key: key , Expires: <expire time>};

s3.getSignedUrl('getObject', params, function (err, url) {
...

答案 1 :(得分:0)

可能不适用于这个特定问题,但我会添加这个,以防有人像我在尝试解决我的问题时一样遇到这个问题。我遇到了同样的签名 URL 过期问题,因为我在我的开发环境中使用 WSL2 + Docker,并且在让我的笔记本电脑进入睡眠状态后,时钟搞砸了。 “修复”是重新启动 WSL2。还有其他选择,但我没有机会测试它们。 this issue

中有一些额外的细节