簡體   English   中英

AWS S3 getSignedUrl() 返回過期的 SignedURL

[英]AWS S3 getSignedUrl() Returns Expired SignedURLs

localhost上可以正常工作,但在 Server 上不行 返回的所有 URL 都已經過期

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

localhost上,為同一個對象生成的 URL 的expires參數不同,但在服務器上沒有。 服務器上的相同對象返回相同的 URL( expires參數每次都相同)。

服務器是 Amazon EC2。 憑證保存在localhost和服務器上的/.aws/credentials文件中

模型代碼

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

在 S3 上編輯 CORS 配置

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
...
// 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) {
...

可能不適用於這個特定問題,但我會添加這個,以防有人像我在嘗試解決我的問題時那樣遇到這個問題。 我有同樣的簽名 URL 過期問題,因為我在我的開發環境中使用 WSL2 + Docker,並且在我的筆記本電腦進入睡眠狀態后,時鍾變得一團糟。 “修復”是重新啟動 WSL2。 還有其他選擇,但我沒有機會測試它們。 這個問題有一些額外的細節

當您生成文件鏈接時,您將擁有類似

https://bucket.s3.amazonaws.com/image2.png?SOME_INFO&X-Amz-Expires=900&SOME_INFO

您需要X-Amz-Expires=900 此參數表示您的 SignedUrl 將過期的秒數。

為了增加時間,你可以使用一些例子

const aws = require('aws-sdk');

const s3 = new aws.S3({
    signatureVersion: 'v4',
    region: 's3-region'
});

const s3FileObject = {
  Bucket: 'your-bucket-name',
  Key: 'file-name.jpg',
  Expires: 60 * 60 // Seconds count
};

const url = s3.getSignedUrl('getObject', s3FileObject);

console.log(url);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM