AWS S3上传 - 使用AccessKey,SecretKey和SessionToken - iOS SDK

时间:2015-06-01 12:03:23

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

我正在开发iOS应用程序,我需要将图像上传到AWS S3Bucket。我从服务器获得临时凭证(accessKey,secretKey,sessionToken和bucketName)以上传图像。

我发现很难确定使用此凭据上传图像的正确API。

使用AWSCognitoCredentialsProvider提供AWS示例程序。

我已经使用Android版本的代码将图像上传到S3。但我在iOS SDK中找不到相应的API。

 BasicSessionCredentials basiccredentials = new BasicSessionCredentials(
                            MY_ACCESS_KEY_ID, MY_SECRET_KEY,
                            MY_SESSION_TOKEN);
AmazonS3Client s3Client = new AmazonS3Client(
                            basiccredentials);
TransferManager manager = new TransferManager(s3Client);
PutObjectRequest por = new PutObjectRequest(Constants.getPictureBucket(), Constants.PICTURE_NAME,file name);
 manager.upload(por);

iOS SDK具有以下CredentialsProvider类

  1. AWSCognitoCredentialsProvider
  2. AWSStaticCredentialsProvider
  3. AWSWebIdentityCredentialsProvider
  4. AWSStaticCredentialsProvider 类仅接受 accessKey secretKey 。其他2个类需要不同的参数。

    当我使用带有accessKey和secretKey的AWSStaticCredentialsProvider上传图片时,我收到以下错误消息

      

    上传失败:[错误域= NSURLErrorDomain Code = -1017“无法解析   响应“UserInfo = 0x7f8773f70ee0 {NSUnderlyingError = 0x7f8773f4bbb0   “操作无法完成。(kCFErrorDomainCFNetwork错误   -1017。)“,NSErrorFailingURLStringKey = https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg,   NSErrorFailingURLKey = https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg,   _kCFStreamErrorDomainKey = 4,_kCFStreamErrorCodeKey = -1,NSLocalizedDescription =无法解析响应}]

    此错误消息不清楚凭据提供程序是否存在问题

    任何帮助都非常感谢您解决此问题

    谢谢

    修改

    我使用了@ user3467204

    提供的示例程序

    以下是带有错误消息的输出(您提供的AWS Access Key ID在我们的记录中不存在)。但是使用相同的密钥,android java代码工作正常。

    Android代码使用accessKey,secrectKey和sessionToken,但iOS代码仅使用accessKey和secrectKey。

      

    2015-06-01 19:42:55.747 AWSV2Test [2191:170157]图片位于/ Users / jpsasi / Library / Developer / CoreSimulator / Devices / E846AC10-82BE-40AA-BB7E-29796A8FAD2B / data / Containers / Bundle /Application/B59E9032-306D-4609-97D6-6C516638463A/AWSV2Test.app/testimage.png   2015-06-01 19:42:56.841 AWSV2Test [2191:170157]上传32677/35516字节   2015-06-01 19:42:56.842 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:42:56.843 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:43:00.249 AWSV2Test [2191:170157]上传32677/35516字节   2015-06-01 19:43:00.250 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:43:00.251 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:43:02.848 AWSV2Test [2191:170157]上传32677/35516字节   2015-06-01 19:43:02.849 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:43:02.850 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:43:05.285 AWSV2Test [2191:170157]上传32677/35516字节   2015-06-01 19:43:05.286 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:43:05.287 AWSV2Test [2191:170157]上传了35516/35516字节   2015-06-01 19:43:06.681 AWSV2Test [2191:170157] error =>错误域= com.amazonaws.AWSS3ErrorDomain代码= 3“操作无法完成。(com.amazonaws.AWSS3ErrorDomain错误3.)”UserInfo = 0x7faea40171d0 {HostId = GeMapgMjrv43TZ4yFKmTjIw6EsZafbgk3GH9ATtbgIj1VpNNv6EjhmZhobHVm + / 2,Message =您提供的AWS访问密钥ID在我们的记录中不存在。,AWSAccessKeyId = ASIAIFYM7NXH3CSNXY3Q,Code = InvalidAccessKeyId,RequestId = 653371138733BE48}

1 个答案:

答案 0 :(得分:5)

如果要使用服务器上生成的临时凭证,则需要实现自己的凭据提供程序。我建议采用以下方法:

  1. 在服务器上生成访问密钥,密钥和会话令牌。您有许多语言选项,包括Java,.NET,PHP,Ruby,Python和Node.js.
  2. 通过符合AWSCredentialsProvider实施您的凭据提供程序。请查看AWSWebIdentityCredentialsProviderAWSCognitoCredentialsProvider的实现作为示例。此凭据提供程序应:
    • 从服务器检索访问密钥,密钥和会话密钥。
    • 在当地坚持到期为止。
    • 请求时返回凭据。
    • 如果过期,请从服务器重新检索它们。
    • 调用- refresh时启动凭据刷新过程。
  3. 我建议你看看Amazon Cognito Identity。借助Amazon Cognito,您可以使用公共登录提供商(如Amazon,Facebook,Google和任何OpenID Connect兼容提供商)或使用您自己的用户身份系统,创建用于访问AWS云服务的唯一最终用户标识符。它涵盖了许多自定义凭据提供程序用例,并且更易于使用和管理。