![](/img/trans.png)
[英]AWS S3 JavaScript SDK getSignedUrl returns base path only
[英]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.