在给出桶的所有必要权限的情况下,使用aws sdk生成的预签名URL访问文件时出现问题。
我已从github下载了示例代码,并根据我的要求更改了下面的Awscredential提供程序。
变化如下
AWSStaticCredentialsProvider *credentialsProvider =[[AWSStaticCredentialsProvider alloc] initWithAccessKey:S3AccessKey secretKey:S3secretKey];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
即使我成功将文件上传到aws,我也无法使用我在上传时从aws sdk获得的预签名网址访问它们。
任何人都可以指出我缺少的东西,以便使用预先签名的URL访问文件。
当在浏览器中加载url时会显示SignatureDoesNotMatch错误
“SignatureDoesNotMatch”的最可能原因是header-field中的内容与生成预签名url时提供的内容不同。
这是一个代码片段,演示如何使用预签名网址生成和下载文件:
AWSS3GetPreSignedURLRequest *getPreSignedURLRequest = [AWSS3GetPreSignedURLRequest new];
getPreSignedURLRequest.bucket = @"bucketname";
getPreSignedURLRequest.key = @"keyname";
getPreSignedURLRequest.HTTPMethod = AWSHTTPMethodGET;
getPreSignedURLRequest.expires = [NSDate dateWithTimeIntervalSinceNow:3600];
AWSS3PreSignedURLBuilder *preSignedURLBuilder = [AWSS3PreSignedURLBuilder defaultS3PreSignedURLBuilder];
[[[preSignedURLBuilder getPreSignedURL:getPreSignedURLRequest] continueWithBlock:^id(BFTask *task) {
if (task.error) {
XCTAssertNil(task.error);
return nil;
}
NSURL *presignedURL = task.result;
//NSLog(@"(GET)presigned URL is: %@",presignedURL.absoluteString);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:presignedURL];
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
NSError *returnError = nil;
NSHTTPURLResponse *returnResponse = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&returnResponse error:&returnError];
return nil;
}] waitUntilFinished];
问题在于预先指定的url编码。在iOS和android sdks(不在Windows中)中,您需要再次在Presigned url中对查询字符串进行编码。
NEWURL baseURL时= +(编码的查询字符串);
NEWURL是您可以访问的正确网址。
它对我有用。
试试这个,您需要注册PreSignedURL构建器。
AWSStaticCredentialsProvider *credentialsProvider =[[AWSStaticCredentialsProvider alloc] initWithAccessKey:S3AccessKey secretKey:S3secretKey];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
// Register S3 PreSignedURL Builder
[AWSS3PreSignedURLBuilder registerS3PreSignedURLBuilderWithConfiguration:configuration forKey:@"configuration_name"];
AWSS3PreSignedURLBuilder * urlBuilder = [AWSS3PreSignedURLBuilder S3PreSignedURLBuilderForKey:@"configuration_name"];