【问题标题】:Amazon S3 iOS SDK v2 Upload with AWSAccessKeyId:Signature使用 AWSAccessKeyId:Signature 上传 Amazon S3 iOS SDK v2
【发布时间】:2014-07-29 23:55:05
【问题描述】:

我正在尝试在 S3 存储桶上上传文件,并且设备正在从另一台服务器(AWSAccessKeyId 和签名)获取访问信息。是否可以使用 AWS iOS SDK v2 上传文件?如果没有,是否有机会为 iOS 使用另一种可能的方法(例如,生成预签名 URL 并执行 http post/put)?

现在我正在使用这种方法,但它是用于 access_key/access_secret:

AWSStaticCredentialsProvider *credentialsProvider = [AWSStaticCredentialsProvider credentialsWithAccessKey:awsAccessKey secretKey:awsSecretKey];
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

AWSS3 *transferManager = [[AWSS3 alloc] initWithConfiguration:configuration];
AWSS3PutObjectRequest *getLog = [[AWSS3PutObjectRequest alloc] init];
getLog.bucket = awsS3Bucket;
getLog.key = awsS3FileNameString;
getLog.contentType = @"text/plain";
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:logFileName];
long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:fileName error:nil][NSFileSize] longLongValue];
getLog.body = [NSURL fileURLWithPath:fileName];
getLog.contentLength = [NSNumber numberWithUnsignedLongLong:fileSize];

[[transferManager putObject:getLog] continueWithBlock:^id(BFTask *task) {        
    if(task.error)
    {
        NSLog(@"Error: %@",task.error);
    }
    else
    {
        NSLog(@"Got here: %@", task.result);

    }
    return nil;
}];

如有任何想法,我将不胜感激。

【问题讨论】:

    标签: ios amazon-web-services amazon-s3


    【解决方案1】:

    我推荐以下方法:

    • 在您的服务器上生成访问密钥秘密密钥会话令牌。您有多种语言选择,包括 Java、.NET、PHP、Ruby、Python 和 Node.js。
    • 通过遵循AWSCredentialsProvider 来实现您自己的凭据提供程序。此凭据提供程序应:
      • 从您的服务器检索访问密钥、秘密密钥和会话密钥。
      • 保留它们直到它们过期。
      • 在请求时返回凭据。
      • 如果它们已过期,请从您的服务器重新检索它们。
      • 调用refresh 也应该启动凭据检索过程。
    • 将您的凭据提供程序分配给defaultServiceConfiguration 或将其传递给initWithConfiguration:

    附带说明,在使用initWithConfiguration: 时,您需要手动保留对AWSS3 实例的强引用。使用defaultS3 将消除这种需要。

    希望这会有所帮助,

    【讨论】:

    • 感谢旁注。不幸的是 AWSCredentialsProvider 不支持 AWSAccessKeyId:Signature
    • 我们现在通过生成 PUT 到服务器上生成的预签名 URL 来做到这一点(我发现这个解决方案是最简单的 IMO)
    • 为了生成签名,您需要临时凭证。您可以将临时凭据发送到设备,而不是在服务器上计算签名。预签名 URL 方法的问题是:1) 您无法利用分段上传。 2)您必须自己处理重试。如果它们对您的用例来说是可以接受的缺点,那么预签名 URL 应该可以正常工作。
    猜你喜欢
    • 2014-10-05
    • 2012-02-14
    • 2014-10-11
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2013-07-21
    相关资源
    最近更新 更多