我正在生成一个预签名url,然后通过该url上传文件。问题是,即使我输入了错误的访问密钥或密钥,我也会得到预签名url,尽管如果我尝试使用该url上传,我会得到400个错误。
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AuthorizationQueryParametersError</Code>
<Message>Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters.</Message>
<RequestId>{requestId}</RequestId>
<HostId>{hostId}</HostId>
</Error>
在生成预签名文件时,有没有什么方法可以让我得到错误,这样我就不必尝试上传文件了。
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("accessKey", "secretKey")))
.withRegion(clientRegion)
.build();
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectKey)
.withMethod(HttpMethod.PUT)
.withExpiration(expiration);
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
2条答案
按热度按时间368yc8dk1#
让我们从这个开始:
静态凭证不符合aws最佳实践。相反,依赖于通过环境变量或执行角色(在ec2、ecs或lambda上运行时)提供的凭据。
验证凭据是否有效的唯一方法是试用它们。您可以编写一个小的虚拟文件,但是由于s3上的最终一致性,这可能会导致应该读取该文件的任何内容出现问题。
还有一个问题是,您给url的过期时间可能与凭据的生存期不一致。
所有这些问题的最佳解决方案是创建一个角色,该角色有权将文件放在s3上,并且持续时间与url过期时间一致(请注意,最长为12小时),然后显式假设该角色以构造请求:
bogh5gae2#
生成预签名的url不需要api调用;它可以由框架使用指定的访问密钥和密码生成。
当接收到请求时,生成的url将由s3进行验证,显然只有在使用有效凭据生成url时才会被接受。
底线:为了验证您的凭证,您需要发出一个api请求,该请求实际上执行对aws的调用。这几乎可以是S3客户机上的任何其他方法。