有没有办法使用生成的预签名 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 将其视为新图像并尝试每次下载,这会影响我的应用程序性能。
我的问题是,有没有什么乐观的方法可以在不缓存的情况下尽可能快地渲染图像?
我试图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) 我想要实现的目标是生成一个指向源自 S3 存储桶的 CloudFront 发行版的 singedURL。
我已成功对直接指向 S3 存储桶的 URL 进行签名,如以下 AWS 规范 -使用适用于 .NET 的 AWS SDK 生成预签名对象 URL中所述,并且工作正常。
但我真正需要的是生成签名的 CloudFront URL。
我假设我的分发已正确配置,因为我可以使用(https://d298o8yem5c56d.cloudfront.net/123.pdf)访问它,假设“限制查看者访问:”在“行为”设置中设置为“否”。将其切换为“是”后,如果没有signedURL,则无法再访问它。
我尝试使用 AWS 开发人员指南中的示例代码:使用 C# 和 .NET Framework 创建 URL 签名
URL已生成,但我收到以下错误消息:
<Error>
<Code>AccessDenied</Code>
<Message>Access denied</Message>
</Error>
有什么想法我应该检查什么吗?
.net c# amazon-web-services amazon-cloudfront pre-signed-url
Scenerio:我正在尝试生成 s3 中对象的 Cloudfront 签名 URL。
步骤:
1. 在 s3 存储桶中创建一个对象并将其公开。
2. 创建一个指向该 s3 存储桶的 cloudfront 分发。
3.使用下面的代码生成签名的url
以下是从其文档生成 cloudfront 签名 url 的代码。
import datetime
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from botocore.signers import CloudFrontSigner
def rsa_signer(message):
with open('path/to/key.pem', 'rb') as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1())
key_id = 'AKIAIOSFODNN7EXAMPLE'
url = 'https://d2949o5mkkp72v.cloudfront.net/hello.txt'
expire_date = datetime.datetime(2017, 1, 1)
cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)
# …Run Code Online (Sandbox Code Playgroud) python amazon-web-services amazon-cloudfront pre-signed-url boto3
我正在尝试使用 Postman 模拟可恢复上传到 GCS 签名 url 以执行两个 PUT 以查看它是如何工作的。
参考几个帖子后:
我可以使用 Google Cloud Storage 签名 URL 进行可恢复上传吗?
如何使用带有签名 url 的 gcs-resumable-upload
我终于成功了并成功恢复了 200 OK,但文件已损坏。以下是步骤:
0)。POST 到我们的服务器(运行 NodeJS 8.11)以获取带有 action=="resumable" 的存储桶签名 url。服务器代码是:
const file = bucket.file(fileName);
const config = {
action: 'resumable',
version: 'v4',
expires,
contentType
};
file.getSignedUrl( config, (error, url) => {
if (error) return reject(error);
resolve(url);
});
Run Code Online (Sandbox Code Playgroud)
这将返回签名网址:
https://storage.googleapis.com/<bucket_name/<path_to_file>?GoogleAccessId=<service_account>&Expires=<expiry_time>&Signature=<signature>
1)。POST 到带有标题{ 'x-goog-resumable': 'start' }和空正文的签名网址。我取回了创建的 HTTP 201,以及与签名 URL 相同的值的“Location”标头,加上&upload_id=AEnB2UqIJL_jf.....末尾的 …
我想实现以下目标 -
1. 生成签名 URL
2. 使用 Postman 上传文件 (image.jpg) 到 URL
我正在使用 AWS Node SDK 创建 URL,
以下是代码 -
const AWS = require('aws-sdk');
AWS.config.update({
region: 'us-east-1'
});
const s3 = new AWS.S3();
var presignedPUTURL = s3.getSignedUrl('putObject', {
Bucket: 'some-bucket',
Key: 'test/image.jpg',
Expires: 3600
});
console.log(presignedPUTURL);
Run Code Online (Sandbox Code Playgroud)
该代码创建了一个 URL,如 -
https://some-bucket.s3.amazonaws.com/test/image.jpg?AWSAccessKeyId=ABCDxxx&Expires=1572339646&Signature=someSignaturexxx
Run Code Online (Sandbox Code Playgroud)
这是邮递员的回复-
<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)
邮递员电话——
-------------------------------------------------- -----------------------------

我试过这个 -
https://medium.com/@aidan.hallett/securing-aws-s3-uploads-using-presigned-urls-aa821c13ae8d
我还尝试了各种组合,代码中的密钥和文件名的上传具有相同的名称,
不同的内容类型组合,
但没有运气。
amazon-s3 amazon-web-services node.js pre-signed-url postman
我在 API 网关后面有一个 Lambda Nodejs 函数,它成功返回预签名 URL:
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
apiVersion: '2006-03-01',
signatureVersion: 'v4'
});
function getSignedUrl(id, type) {
const key = `uploads/${id}.${type}`;
return S3.getSignedUrl('putObject', {
Bucket: 'example-bucket-name',
Key: key,
Expires: 300
});
}
Run Code Online (Sandbox Code Playgroud)
预签名 URL 可能如下所示:
然而,当在浏览器中测试所述 URL 时,我得到一个 SignatureDoesNotMatch。我认为这似乎很公平,因为我只想稍后将其与应用程序中的 PUT 一起使用。
然而,使用curl或postman我得到403 Forbidden:
curl -v -X PUT -T 489eb7115d0c479eaf9c3b6a01eb1893.png "https://example-bucket-name.s3.eu-central-1.amazonaws.com/uploads/489eb7115d0c479eaf9c3b6a01eb1893.png?Content-Type=image%2Fpng&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIARTVN4TPKUACY5POZ%2F20200616%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20200616T104031Z&X-Amz-Expires=300&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEEMaDGV1LWNlbnRyYWwtMSJHMEUCIQCDd%2B5hFjcBd%2FA6TEV7Se6L%2B6V8VtgCrMg0%2FbOkoGKy1wIgL20u20i%2B80rnBf49MfU1T3MQK2RQdoyQF6SwGQiYgeMq7gEIvP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARABGgwxMTA5NjAwOTAwNjkiDIcy2z8%2FpQIhMOOaZirCAUFhV6uGF%2Ff44lDl%2BaFxIt9D302gcuPaxlrgZWlRMHb%2FEdrKFJsWP%2FG7%2B6ovilKh9WmcBX1fzuVa%2BHQ6rv6OaCueMEnDOBEj%2FvJ1hrI%2FwMDF1RLVlqq7pTDp6h6hmUxPfbqXu1k8sjcFotVzXZTzR0dX6kmWl41uEvaglXjrGG3ApvviH%2BSFLdUdvK9PBgrgSlamGIhxdJN75xxBzQMELfdpPJ6QanhLEwIa%2FuMliHPliXC2fasMzFEheA3Xmik43McnMJ3DovcFOuABdae1G7uUXOSaQzGZ7IjPLLZnMFfow4SzosQHlMUurlqQATPbieC9W3McsMVwggwzZX6BcN9OJb%2B0Ag3x9pS5eLnLsEio%2FyAPZJfXzoGBH5AdZ6TAZtC5cgKy0TEebH%2F3bF4%2FiamoTQ6YcZ4f48NefoNFHcRPXl3VF%2FdINmuTSG1cNlh2svT9jAUfOgaeK7tnFAW79L38Nv7xnnFMYFpyxoUx8XVkffCXmq15dyG7rLIR0FHkJ7p4C8eEqbQzOj%2Fsj1ELFFAWPtq38ZgFnWF%2BYf6W4UrkHD9AGdUucD1qvAA%3D&X-Amz-Signature=e11f346296a979e586b8f81a9db2ef2ce58c9f7a13a4f3c31f9a0bb9997b8b81&X-Amz-SignedHeaders=host"
Run Code Online (Sandbox Code Playgroud)
Lambda 函数具有以下权限:
s3:ListBucket Allow: arn:aws:s3:::example-bucket-name
s3:GetBucketLocation Allow: arn:aws:s3:::example-bucket-name
s3:PutObject Allow: arn:aws:s3:::example-bucket-name/uploads/*
Run Code Online (Sandbox Code Playgroud)
S3 Bucket …
amazon-s3 amazon-web-services node.js pre-signed-url aws-lambda
pre-signed-url ×10
amazon-s3 ×7
node.js ×3
.net ×1
aws-lambda ×1
aws-sdk ×1
boto3 ×1
c# ×1
image ×1
javascript ×1
post ×1
postman ×1
python ×1
react-native ×1
resumable ×1
upload ×1