Aws iOS sdk Pre-singed url给出“SignatureDoesNotMatch”错误

问题描述 投票:0回答:3

在给出桶的所有必要权限的情况下,使用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错误

ios amazon-web-services amazon-s3 aws-sdk
3个回答
1
投票

“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];

0
投票

问题在于预先指定的url编码。在iOS和android sdks(不在Windows中)中,您需要再次在Presigned url中对查询字符串进行编码。

NEWURL baseURL时= +(编码的查询字符串);

NEWURL是您可以访问的正确网址。

它对我有用。


0
投票

试试这个,您需要注册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"];
© www.soinside.com 2019 - 2024. All rights reserved.