我想将预签名 URL 与 AWS S3 结合使用。我注意到预签名 URL 包含aws_access_key_id
和aws_security_token
.
根据我的理解,它aws_security_token
是 URL 的一部分,因为我使用的是临时安全凭证,并且它是正确签署 URL 所必需的。
但是,给前端客户端提供 URL 来下载图像是否可以?是aws_security_token
URL 的一部分(未加密)。我担心安全性,并且无法弄清楚令牌的用途是什么。以及攻击者可以用 myaws_access_key_id
和aws_security_token
.
mutlipart/formdata ---boundaryString
如何使用谷歌存储的签名网址上传内容类型的文件?
我面临的问题是,当我们使用浏览器上传文件时,浏览器将内容类型放置在内容类型标头值的动态部分mutlipart/formdata ---boundaryString
中。boundaryString
现在,由于谷歌签名方法要求内容类型成为签名的一部分。生成签名 URL 变得不可能。
我按照https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html中的示例创建预签名 s3 url (v4),当我尝试访问已签名的 s3 url (v4) 时,出现“访问被拒绝”错误网址
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>0FB02ECDDF5EAC7B</RequestId>
<HostId>vA+mmsv9PCunNe5uPkPrmpqqN3vFctQ13c9dIRlKWTYsT0zNA1V9g+4YS+lCItrBlyQtdHpyspg=</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)
以下是代码片段
public class GeneratePresignedURL {
public static void main(String[] args) throws IOException {
String clientRegion = "us-east-1";
String bucketName = "com-example-bucket";
String objectKey = "path/to/file.img"; // No leading `/`
// https://com-example-bucket.s3.amazonaws.com/path/to/file.img
try {
AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
// Assuming that us-east-1 defaults to v4, couldn't find a way to set it explicitly
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(clientRegion)
.withCredentials(awsCredentialsProvider)
.build();
// Set …
Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-web-services pre-signed-url aws-sdk aws-java-sdk
我正在将一个虚拟文件上传到 Google Cloud Storage,然后在将它传递给另一个单独托管的服务之前签署一个读/写 URL。不幸的是,我收到了 403 响应,其中包含以下消息:
我们计算的请求签名与您提供的签名不匹配。检查您的 Google 密钥和签名方法。
我用来创建虚拟对象并签署 URL 的代码:
const string BASE64_JSON_CREDS = "UklQIFN0YW4gTGVl"; // credentials of service account with "Storage Admin" role (entire json file as received from Google's Console)
const string BUCKET = "testbucket";
const string FILENAME = "test.jpg";
byte[] imageBytes = File.ReadAllBytes(@"test.jpg");
GoogleCredential credentials = null;
using (var stream = new MemoryStream(Convert.FromBase64String(BASE64_JSON_CREDS)))
{
credentials = GoogleCredential.FromStream(stream);
}
StorageClient storageClient = StorageClient.Create(credentials);
var bucket = await storageClient.GetBucketAsync(BUCKET);
await storageClient.UploadObjectAsync(bucket.Name, FILENAME, null, new MemoryStream());
var …
Run Code Online (Sandbox Code Playgroud) c# google-cloud-storage pre-signed-url google-cloud-platform
所以我有一个问题,每当我尝试使用预签名 URL 将文件发布到 s3 存储桶时,元数据的密钥将被强制为小写?
我查看了预签名 URL,当 URL 生成时它已经设置了小写部分,我想知道为什么?我该如何解决这个问题?
我尝试在文件的 s3 存储桶中创建手动键值对,显然我也可以在其中设置大写字母的键?
const params = {
Bucket: 'buckets3',
Key: 'hoho-fileUpload-' + uuid.v4(),
Metadata: {"FooBar": "FooBar"},
Expires: 600
};
Run Code Online (Sandbox Code Playgroud)
s3 中的电流输出:
x-amz-meta-foobar: FooBar
许愿输出:
x-amz-meta-FooBar:FooBar
metadata amazon-s3 amazon-web-services pre-signed-url aws-sdk
我正在为客户端将视频文件上传到 s3 的应用程序编写 django 后端。我想使用预先签名的 url,因此 django 服务器将对 url 进行签名并将其传递回客户端,然后客户端将他们的视频上传到 s3。问题是, generate_presigned_url 方法似乎不知道 s3 客户端 upload_file 方法......
按照这个例子,我使用下面的代码来生成上传的 url:
s3_client = boto3.client('s3')
try:
s3_object_name = str(uuid4()) + file_extension
params = {
"file_name": local_filename,
"bucket": settings.VIDEO_UPLOAD_BUCKET_NAME,
"object_name": s3_object_name,
}
response = s3_client.generate_presigned_url(ClientMethod="upload_file",
Params=params,
ExpiresIn=500)
except ClientError as e:
logging.error(e)
return HttpResponse(503, reason="Could not retrieve upload url.")
Run Code Online (Sandbox Code Playgroud)
运行它时,我收到错误:
文件“/Users/bridgedudley/.local/share/virtualenvs/ShoMe/lib/python3.6/site-packages/botocore/signers.py”,第 574 行,在 generate_presigned_url operation_name = self._PY_TO_OP_NAME[client_method] KeyError: 'upload_file '
触发异常:
botocore.exceptions.UnknownClientMethodError:客户端没有方法:upload_file
调试后,我发现 self._PY_TO_OP_NAME 字典仅包含此处提供的 s3 客户端命令的一个子集:
没有upload_file 方法!我使用“list_buckets”尝试了相同的代码,它工作得很好,给了我一个预先签名的 …
我正在尝试生成指向 API 网关(使用 IAM 身份验证)的预签名链接,因此客户端可以访问我在此 API 网关后面的 Lambda 函数之一,而无需对请求进行身份验证。这主要是为了方便客户端,因此它可能会透明地使用响应中的一些链接,无论它们指向同一个经过身份验证的 API 网关、某个 S3 存储桶还是 Internet 中的任意 URL。
为此,我使用查询参数制作 API 签名 v4(请参阅文档和示例)
因此,如果我尝试签署以下针对us-west-2
区域和execute-api
服务范围的链接:
https://example.com/some/path?some=params
Run Code Online (Sandbox Code Playgroud)
我将得到以下结果(使用 Node.jsaws4
库,但在这里无关紧要):
https://example.com/some/path?some=params&
X-Amz-Security-Token=<Session Token Removed>
X-Amz-Date=20210330T180303Z&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=<Access Key Removed>%2F20210330%2Fus-west-2%2Fexecute-api%2Faws4_request&
X-Amz-SignedHeaders=host&
X-Amz-Signature=884f132ad6f0c7a850e6b1d22b5fed169c13e2189b6e0d0d568d11f967f4a8bd
Run Code Online (Sandbox Code Playgroud)
它有效!但只有在一代后的前 5 分钟......
五分钟过去后,我将收到以下错误响应:
https://example.com/some/path?some=params
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅对此问题的回复。
我尝试X-Amz-Expires
使用各种值(小于和大于 300 秒)添加文档中提到的查询参数,但没有运气:行为不会改变。
对于由 IAM 实例凭证生成的链接,我至少需要几个小时,最多需要6 个小时,因为链接正在由另一个 Lambda 函数签名。
有没有办法增加 API Gateway 访问的预签名链接有效期?
我的后端是一个 nodejs 应用程序,我希望用户将图像上传到 Amazon S3 存储桶。
从我的服务器运行:
const s3 = new AWS.S3({
params: {
Bucket: bucket
}
});
app.get('/api/images/signed-url', authMiddleware, (req, res) => {
s3.getSignedUrl('putObject',
{ ContentType: 'image/jpeg', Key: uuid() + '.jpeg' },
(_err, url) => res.send({ signedUrl })
})
Run Code Online (Sandbox Code Playgroud)
然后从我的浏览器客户端上传到该端点
该网址如下所示:
https://my-s3-bucket.s3.ap-southeast-2.amazonaws.com/0050db00-c64c-419a-83c2-e8615120f458.jpeg?AWSAccessKeyId=MY_ACCESS_KEY&Content-Type=image%2Fjpeg&Expires=1625365030&Signature=1ebnshTgeMKoLMAH%2Bi2FLletsAU%3D
Run Code Online (Sandbox Code Playgroud)
鉴于此 URL 包含 my MY_ACCESS_KEY_ID
,与客户共享是否安全?我不分享我的秘密(显然),但它是等式的一半。
我正在尝试为 AWS 上的 S3 存储桶生成一个预先签名的 URL 以上传文件,如下所示:
$ aws s3 presign s3://mybucket/somefolder/
Run Code Online (Sandbox Code Playgroud)
然后我使用该 URL 上传文件:
$ curl "https://mybucket.s3.amazonaws.com/somefolder/?AWSAccessKeyId=***&Signature=***&Expires=***" --upload-file "./file"
Run Code Online (Sandbox Code Playgroud)
但随后它会打印出一个 XML 错误:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<AWSAccessKeyId>***********</AWSAccessKeyId>
<StringToSign>PUT
************
/mybucket/somefolder/</StringToSign>
<SignatureProvided>**************</SignatureProvided>
<StringToSignBytes>**************</StringToSignBytes>
<RequestId>************</RequestId>
<HostId>************</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
[更新]
好的,所以我必须在预签名 URL 中指定对象名称。所以我做了,但我仍然面临同样的错误信息:
$ aws s3 presign s3://mybucket/someobject
Run Code Online (Sandbox Code Playgroud)
进而:
$ curl "https://mybucket.s3.amazonaws.com/someobject?AWSAccessKeyId=***&Signature=***&Expires=***" --upload-file "./file"
Run Code Online (Sandbox Code Playgroud)
我会得到与以前完全相同的错误。为了确保这不是权限问题,我像这样测试了它:
$ aws s3 cp ./file s://mybucket/
Run Code Online (Sandbox Code Playgroud)
并且文件被复制了!有什么建议?
[更新] …
我正在尝试使用预先签名的 URL 在我的 s3 存储桶中上传一个文件,它运行良好并将数据成功上传到存储桶,但是,我上传的文件非常大,我需要能够显示进度条。我在 StackOverflow 和其他博客文章上尝试了许多可用的解决方案,但似乎没有任何帮助。
以下是使用预签名 URL 将数据上传到 s3 的代码片段。
object_name = 'DataSet.csv'
response = create_presigned_post("mybucket_name",object_name)
fields = response['fields']
with open(object_name, 'rb') as f:
files = {'file': (object_name, f)}
http_response = requests.post(response['url'], data=fields, files=files,stream=True)
print (http_response.status_code)
Run Code Online (Sandbox Code Playgroud)
它返回用于成功上传的204状态。
现在,我可以对此代码进行哪些更改以显示进度条。
PS 我尝试stream=True
过请求不起作用。我曾尝试使用tqdm迭代响应,但在这种情况下也不起作用。
pre-signed-url ×10
amazon-s3 ×7
aws-sdk ×2
python ×2
aws-cli ×1
aws-java-sdk ×1
boto3 ×1
c# ×1
file-upload ×1
metadata ×1
sigv4 ×1
upload ×1