Angular 发布到AWS S3预签名url时出现SignatureDesNotMatch错误
真的很挣扎,所以任何帮助都将是伟大的 因此,我试图使用预先签名的URL直接从浏览器上传pdf文件到AmazonS3 我使用AWS Java SDK(用Kotlin编写的代码)在服务器上生成url,如下所示:Angular 发布到AWS S3预签名url时出现SignatureDesNotMatch错误,angular,amazon-web-services,amazon-s3,kotlin,pre-signed-url,Angular,Amazon Web Services,Amazon S3,Kotlin,Pre Signed Url,真的很挣扎,所以任何帮助都将是伟大的 因此,我试图使用预先签名的URL直接从浏览器上传pdf文件到AmazonS3 我使用AWS Java SDK(用Kotlin编写的代码)在服务器上生成url,如下所示: val objectKey = StringBuilder().append("xxx").append("/").append("file1.pdf").toString() val expiration = java.util.Date() var msec =
val objectKey = StringBuilder().append("xxx").append("/").append("file1.pdf").toString()
val expiration = java.util.Date()
var msec = expiration.time
msec += (1000 * 60).toLong() // Add 1 minute. This means that the url expires in 1 minute.
expiration.time = msec
String bucketName = "test"
val responseHeaders = ResponseHeaderOverrides().withContentType("multipart/form-data")
val generatePresignedUrlRequest = GeneratePresignedUrlRequest(bucketName, objectKey)
generatePresignedUrlRequest.method = HttpMethod.POST
generatePresignedUrlRequest.responseHeaders = responseHeaders
generatePresignedUrlRequest.expiration = expiration
return s3Client.generatePresignedUrl(generatePresignedUrlRequest)
然后,此url将返回到使用Angular的浏览器代码。
然后,我使用以下typescript代码直接上传文件:
returnPresignUrl() {
return this.http.get(this.attachmentUploadUrl, this.httpOptions);
}
但我得到以下错误响应:
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you
provided. Check your key and signing method.
</Message>
有什么想法吗
我在预签名url中指定内容类型标头,然后在url的post请求中设置它,因此我看不到标头不匹配的原因(这一错误似乎导致了我看到的问题)
post请求有什么特别之处吗?
将pdf文件上载到S3的内容类型正确吗
任何洞察都会很棒,谢谢 使用:
generatePressignedUrlRequest.setContentType(“应用程序/八位字节流”)代码>
而不是:
多部分/表单数据
下面是生成预签名URL的方法:
public GeneratePresignedUrlRequest getGeneratePresignedUrlRequest(String tempBucketName,String objectKey){
Date expirationTime = getExpirationTime();
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(tempBucketName, objectKey);
generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
generatePresignedUrlRequest.setExpiration(expirationTime);
generatePresignedUrlRequest.setContentType("application/octet-stream");
return generatePresignedUrlRequest;
}
当您拨打电话上传文件时,您应该使用相同的内容类型。您可以检查您的访问密钥和密钥吗?当您的密钥无效时,也会出现此错误。Java SDK指示您应该使用setMethod(HttpMethod方法),支持的方法有get、PUT、DELETE和HEAD。使用PUT。另外,通常您应该使用setter方法,如setResponseHeaders()。当我将其更改为PUT时,会出现拒绝访问错误。有什么想法吗?access key和secret key不应该包含在其中,因为使用预签名URL的全部目的是我们不需要在浏览器中创建和存储安全凭据。此外,这是Kotlin代码,请记住,直接引用字段并将其设置为与调用set()methodOK相同,因此现在您将获得AccessDenied,你已经克服了最初的问题。您的预签名URL是否过期?客户端时间是否同步?
public GeneratePresignedUrlRequest getGeneratePresignedUrlRequest(String tempBucketName,String objectKey){
Date expirationTime = getExpirationTime();
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(tempBucketName, objectKey);
generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
generatePresignedUrlRequest.setExpiration(expirationTime);
generatePresignedUrlRequest.setContentType("application/octet-stream");
return generatePresignedUrlRequest;
}