amazon web services - AWS S3上传-使用AccessKey, SecretKey和Sessio



我正在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有以下凭证提供商类

  1. AWSCognitoCredentialsProvider
  2. AWSStaticCredentialsProvider
  3. AWSWebIdentityCredentialsProvider

AWSStaticCredentialsProvider类只接受accessKeysecretKey。其他两个类需要不同的参数。

当我使用AWSStaticCredentialsProvider与accessKey和secretKey上传图像时,我得到以下错误消息

上传失败:[Error Domain=NSURLErrorDomain Code=-1017 "无法解析response" UserInfo=0x7f8773f70ee0 {NSUnderlyingError=0x7f8773f4bbb0 ."操作无法完成。(kCFErrorDomainCFNetwork错误-1017年。)",NSErrorFailingURLStringKey = https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpgNSErrorFailingURLKey = https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg_kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-1, NSLocalizedDescription=cannot parse response}]

此错误消息不清楚是凭据提供程序的问题还是其他问题

任何帮助都非常感谢解决这个问题

谢谢

编辑

我使用了@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.png2015-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 => error Domain=com.amazonaws. net。AWSS3ErrorDomain Code=3 "操作无法完成。"(com.amazonaws。AWSS3ErrorDomain错误3.)"UserInfo=0x7faea40171d0 {HostId= gemapgmjrv43tz4yfkmtjiw6eszafbgk3gh9attbgij1vpnnv6ejhmzhbhvm +/2, Message=您提供的AWS Access Key Id在我们的记录中不存在。, AWSAccessKeyId=ASIAIFYM7NXH3CSNXY3Q, Code=InvalidAccessKeyId, RequestId=653371138733BE48}

如果希望使用在服务器上生成的临时凭据,则需要实现自己的凭据提供程序。我推荐以下方法:

  1. 在服务器上生成访问密钥、密钥和会话令牌。您有许多语言选项,包括Java, . net, PHP, Ruby, Python和Node.js。
  2. 通过符合AWSCredentialsProvider实现您的凭据提供程序。以AWSWebIdentityCredentialsProviderAWSCognitoCredentialsProvider的实现为例。此凭据提供程序应该:
    • 从服务器获取访问密钥、秘密密钥和会话密钥。
    • 在本地持久化它们,直到它们过期。
    • 在被请求时返回凭据。
    • 如果过期,重新从服务器上检索它们。
    • 启动- refresh调用时的凭据刷新过程。

我鼓励你看看Amazon Cognito Identity。使用Amazon Cognito,您可以通过使用公共登录提供商(如Amazon、Facebook、Google和任何OpenID Connect兼容的提供商)或使用您自己的用户身份系统,为访问AWS云服务创建唯一的最终用户标识符。它涵盖了许多自定义凭证提供程序用例,并且更易于使用和管理。

最新更新