我正在使用适用于 .NET 的 AWS 开发工具包,目前正在为我的 S3 存储桶生成预签名 URL。
我目前得到的网址就像 https://{bucketname}.s3.amazonaws.com/{FileAndQueryParameters}
我正在寻找的是类似的东西 https://{MyDomainName}/{FileAndQueryParameters}
我已经尝试用我自己的 CNAME 指向替换第一个 url,{bucketname}.s3.amazonaws.com但我得到了一个明显的
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
Run Code Online (Sandbox Code Playgroud)
任何想法如何实现这一点?
顺便说一下,这是我现在使用的代码:
(...)
AmazonS3 client = AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey);
string S3_KEY = Key;
string BUCKET_NAME = Bucket;
string FOLDER = SubFolder;
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest();
request.WithBucketName(BUCKET_NAME);
request.WithKey(FOLDER + "/" + S3_KEY);
if (ssUseHTTPS)
{
request.WithProtocol(Protocol.HTTPS);
}
else
{
request.WithProtocol(Protocol.HTTP);
}
if …Run Code Online (Sandbox Code Playgroud) 我正在开发一项功能,使用 Angular/presigned url 和 API Gateway/Lambda 将文件上传到 S3,以生成预签名 url。
我的工作流程描述如下:
const body = { fileName: this.selectedFile.name } const preSignedUrl = await this.http.post('https://xxxxx.execute-api.eu-west-1.amazonaws.com/dev/v1/profile/avatar ', body).toPromise();
后端
我正在使用无服务器(Lambda/API 网关)来计算 presignedUrl。
拉姆达
const AWS = require('aws-sdk')
module.exports.uploadLargeFile = async (event) => {
console.log('1. Event: ', event.body);
const reqBodyAsString = event.body || '{}';
const fileName = JSON.parse(reqBodyAsString).fileName;
return getUploadURL(fileName);
}
const getUploadURL = async (fileName) => {
const s3Params = {
Bucket: process.env.AVATAR_BUCKET,
Expires: 60 …Run Code Online (Sandbox Code Playgroud) file-upload amazon-s3 amazon-web-services pre-signed-url angular
标题说明了一切.这是我的代码;
我正在使用node-formidable文件.
form.on("end",function(field, file){
params.Body = fs.createReadStream(params.filePath)
delete params.filePath;
S3.getSignedUrl('putObject',params, function(err, url) {
if(err){console.log(err);}
console.log(url);
});
})
Run Code Online (Sandbox Code Playgroud)
成功上传后,url变量返回s3 url,类似这样;
但仍然收到SignatureDoesNotMatch错误.在描述中说
我们计算的请求签名与您提供的签名不匹配.检查您的密钥和签名方法.
这是我的参数
params = {
Bucket:"bucketname",
Key: file.name,
ACL: 'public-read'
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
有没有办法使用生成的预签名 URL 通过浏览器进行分段上传?
我目前正在使用 AWS javascript SDK 创建预签名的 POST。(请注意,这个问题与预签名的 PUT/URL 无关,这是另一个 s3 功能)
https://github.com/aws/aws-sdk-js/
尝试创建预签名帖子时,我会执行以下操作:
const params = {
Bucket: 'myuniques3bucket',
Fields: {
Key: 'key1.png',
'Content-Type': 'image/png'
},
conditions: [
{bucket: 'myuniques3bucket'},
{key: 'key1.png'},
{'Content-Type': 'image/png'},
['content-length-range', 1024, 1048576], // 1KB to 10MB
{'x-amz-date': amzDate},
{'x-amz-algorithm': 'AWS4-HMAC-SHA256'},
{'x-amz-credential': `${process.env.AWS_ACCESS_KEY_ID}/20180820/us-east-2/s3/aws4_request`}
],
Expires: 300 // 300 seconds
}
s3.createPresignedPost(params, (err, data) => {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
我正在围绕不应该工作的上传过程进行测试。我发现这里没有强制执行内容类型,因为我可以上传其他文件类型和其他内容类型的帖子参数。
我不清楚 JS SDK 是否为用户管理签名过程,或者我是否需要做一些特殊的事情来在签名中获取这些不同的密钥。
很明显,我可以做一些这样的事情,但不清楚我是否需要。不确定图书馆是否应该为我处理这个问题。
TLDR;我需要做什么才能使用 js sdk 通过 s3 预签名 POST 激活内容类型验证?
任何帮助将不胜感激。
我正在使用FastImage缓存图像,并且在按预期缓存数据后加载图像的速度非常快。但是我的服务器每次都为相同的图像生成新的 uri(s3 预签名 url)。
因此,FastImage 将其视为新图像并尝试每次下载,这会影响我的应用程序性能。
我的问题是,有没有什么乐观的方法可以在不缓存的情况下尽可能快地渲染图像?
我知道如何通过存储桶策略在 S3 上强制执行 SSL。
但即使使用此存储桶策略,预签名的 S3 对象 URL也可以使用 HTTP 和 HTTPS 访问。
有没有办法在预签名 URL 上强制执行 SSL?在预签名期间使用存储桶策略或使用特定选项。
我试图pre-signed URL用 7dsys 过期时间生成。(据说最长持续时间为 7 天,AWS S3 预签名 URL 没有到期日)
# It is called and retruned in AWS Lambda
boto3.client('s3').generate_presigned_url(
'get_object',
Params={'Bucket': bucket, 'Key': object_key},
ExpiresIn=(60*60*24*7) # 7days
)
Run Code Online (Sandbox Code Playgroud)
然而,似乎不是保留了pre-signed URL7 天,而是仅仅保留了几个小时。之后pre-signed URL只返回 XML 格式。
<Error>
<Code>ExpiredToken</Code>
<Message>The provided token has expired.</Message>
.
.
.
</Error>
Run Code Online (Sandbox Code Playgroud)
甚至每次尝试的过期时间似乎都不一样,有时是 5 小时,有时是 12 小时。
我不知道为什么。
我正在尝试通过来自 NodeJS 服务器(而不是来自浏览器)的签名 url 将图像上传到 aws-s3。要上传的图像已由 NodeJS 生成。我从 aws 获取签名的 url 并成功将其上传到 s3。
但是我的形象被破坏了。出于某种原因,S3 正在向我的图像添加一些标题(比较附加的图像)。
我究竟做错了什么?
获取签名网址:
try {
var params = {
Bucket: bucketName,
Key: 'FILE_NAME.png',
Expires: 60
};
const url = await s3.getSignedUrlPromise('putObject', params);
return url;
} catch (err) {
throw err;
}
Run Code Online (Sandbox Code Playgroud)
上传到 s3
var stats = fs.statSync(filePath);
var fileSizeInBytes = stats["size"];
const imageBuffer = fs.readFileSync(filePath);
var formData = {
'file': {
value: imageBuffer,
options: {
filename: 'FILE_NAME.png'
}
}
};
request({
method: 'put',
url,
headers: { …Run Code Online (Sandbox Code Playgroud) 我处于这种情况,我需要一个预签名的网址才能生存一个月左右。由于签名 v4 无法提供此功能,因此我决定暂时使用 V2。
我已将过期时间设置为 1 个月,但由于某种原因它会在 1 天后过期?(不知道具体到期时间,可能是同一天)
<Code>ExpiredToken</Code>
<Message>The provided token has expired.</Message>
Run Code Online (Sandbox Code Playgroud)
当我进一步深入研究时,问题似乎出在 X-Amz-Security-Token 上,它过期得太早了。但我不知道如何为此标头设置值?(找不到任何相关信息)
设置:它是一个 lambda 函数,可生成签名 url 以从 S3 获取文件。一切都是通过云信息来完成的。并使用 JavaScript SDK 完成
const s3 = new AWS.S3({
signatureVersion: 'v2',
region: 'eu-west-1'
});
const bucketParam = {
Bucket: 'test-bucket',
Key: 'testFile-1111-2222',
Expires: 2592000
};
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激
amazon-s3 amazon-web-services aws-cloudformation pre-signed-url aws-lambda
amazon-s3 ×10
pre-signed-url ×10
node.js ×2
angular ×1
aws-lambda ×1
aws-sdk ×1
file-upload ×1
image ×1
javascript ×1
post ×1
react-native ×1
upload ×1