解决了:
我想从我的Amazon S3服务器上获得一个签名的URL。我是AWS的新手。我在哪里设置我的密钥和access_id_key,以便S3识别来自服务器的请求。
var express=require('express');
var app=express();
var AWS = require('aws-sdk')
, s3 = new AWS.S3()
, params = {Bucket: 'my-bucket', Key: 'path/to/key', Expiration: 20}
s3.getSignedUrl('getObject', params, function (err, url) {
console.log('Signed URL: ' + url)
})
app.listen(8000)
Run Code Online (Sandbox Code Playgroud) file-upload amazon-s3 amazon-web-services node.js pre-signed-url
我正在尝试使用从服务器端(用 python 编码)应用程序生成的签名 URL 将视频文件从 android 应用程序上传到 S3 服务器中的存储桶。我们正在向签名的 URL 发出 PUT 请求,但我们得到了
connection reset by peer exception.
但是当我在 POSTMAN REST CLIENT 上尝试相同的 URL 时,会收到一条成功消息。任何帮助将不胜感激。
在阅读有关与的交互时Amazon S3,我知道与的请求身份验证通过Amazon AWS两种方式完成
问题是,在哪种情况下我应该更喜欢一种方法。这两种身份验证方法是否各有优缺点?作为开发人员,通过使用query string parameters方法,我可以对URL进行预签名,从而使最终用户可以Amazon S3通过在Web浏览器中输入预签名的URL 来临时访问资源。我可以使用HTTP Authorization方法来实现相同的目的吗?如果是这样,哪种方法更好用?它们各自的局限性是什么?
authentication amazon-s3 httprequest amazon-web-services pre-signed-url
首先,我使用的是ruby的aws-sdk,但是我面对的似乎是对S3的预贴帖子的误解。
我想要做的是确保通过我的预贴帖子上传到S3的所有内容都是视频。
我尝试做的是content_type_starts_with: "video/"在presigned_post哈希中设置。这会导致所有上载被拒绝Policy Condition failed: ["starts-with", "$Content-Type", "video/"]。
然后content_type: "video/mp4",我尝试了,但是这导致s3允许任何文件上传,然后仅Content-Type: "video/mp4"在元数据中对其进行标记。
然后我注意到,当我上传没有Content-Type约束的文件时,S3会将文件标记为binary/octet-stream。因此,我再次尝试了第一种方法,但是这次使用content_type_starts_with: "binary/"。结果与之前相同Policy Condition Failed。
我应该如何使用Content-Type字段?它似乎从未做过我想要做的事情。
这是我正在使用的代码的片段:
# In the controller
client = Aws::S3::Client.new(region: 'us-east-1')
resource = Aws::S3::Resource.new(client: client)
bucket = resource.bucket("my-bucket")
object_id = SecureRandom.uuid
object = bucket.object(object_id)
@presigned_post = object.presigned_post({
acl: "private",
content_length_range: 0..104857600, # 100 MB
content_type_starts_with: "video/",
})
# In the presigned post erb
<form action="<%= presigned_post.url %>" method="post" enctype="multipart/form-data">
<% presigned_post.fields.each …Run Code Online (Sandbox Code Playgroud) 我正在尝试生成客户端可以用来将图像上传到特定S3存储桶的预签名URL。我已经成功生成了对GET文件的请求,如下所示:
GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucket, filename);
urlRequest.setMethod(method);
urlRequest.setExpiration(expiration);
Run Code Online (Sandbox Code Playgroud)
其中expiration和method分别是Date和HttpMethod对象。
现在,我试图创建一个URL,以允许用户放置文件,但是我不知道如何设置最大内容长度。我确实找到了有关POST政策的信息,但是我更喜欢在这里使用PUT-我也想避免构造JSON,尽管这似乎不太可能。
最后,一个替代的答案可能是将图像上传从API网关传递到Lambda的某种方法,因此我可以在验证文件类型和大小后将其从Lambda上传到S3(这不理想)。
我们的下载托管在Google云端存储上.有一段时间了,我们一直在按需创建一个已签名的URL(当用户点击下载按钮时),然后将用户重定向到该URL.
这段代码已经生产了几个月,但最近我们发现存在竞争条件:有时URL还没有准备好.在此之前,尝试访问签名的URL会导致a 403: Forbidden.
我们尝试通过发送HEAD请求来查询URL是否准备就绪,以寻找200响应,从而缓解此问题.这似乎是一个很好的解决方案,直到我们意识到偶尔存在第三个状态:URL已创建,但尚未准备好.我们的HEAD收到了200 Success以下XML文档的回复:
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature
you provided. Check your Google secret key and signing method.
</Message>
<StringToSign>
GET 1469137341 /our-bucket-name/path/to/file.exe?
response-content-disposition%3dattachment%3b+filename%3dfile.exe
</StringToSign>
</Error>
Run Code Online (Sandbox Code Playgroud)
几秒钟后,URL就可以使用了.创建签名URL的文档没有讨论它没有立即准备好的可能性.
我的问题:您如何确定新创建的签名URL何时可以使用?
编辑
我们实际上已经使用了URL生成代码(并且它一直运行良好)已有好几个月了.仅在最近两周内我们才注意到我们使用了回退机制(即URL尚未就绪).这几乎就像谷歌在上个月改变了代码,这导致了URL准备就绪时的延迟.到目前为止,竞争条件甚至不明显.
我在Binance上设置了一个只读API密钥,以访问帐户信息(例如货币余额),但看不到JSON数据。我输入URL的字符串查询返回以下错误:
{“代码”:-2014,“ msg”:“ API密钥格式无效。”}
我使用的网址是这样的: https://api.binance.com/api/v3/account?X-MBX-APIKEY=**key**&signature=**s-key**
可以在以下位置找到Binance API的文档:https ://www.binance.com/restapipub.html 。我究竟做错了什么 ?
我使用预先签名的URL将文件从我的应用程序上传到S3,存储桶本身是私有的,并且仅对所有域启用了CORS(对于开发环境)。
但是,当axios帖子尝试上载文件时,我看到没有“ Access-Control-Allow-Origin”标头错误。飞行前选项请求引发此错误。
我正在从本地计算机上尝试此操作。
这是我的CORS配置。我没有为运气尝试过AllowedOrigin的通配符'*'。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://localhost:3000</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<MaxAgeSeconds>300000</MaxAgeSeconds>
<AllowedHeader>authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>Run Code Online (Sandbox Code Playgroud)
感谢任何帮助。
我正在尝试使用 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.....末尾的 …
我在 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
file-upload ×2
httprequest ×2
node.js ×2
android ×1
api ×1
aws-lambda ×1
axios ×1
java ×1
put ×1
reactjs ×1
resumable ×1
ruby ×1
url ×1