AWS S3 上传 - 使用 AccessKey、SecretKey 和 SessionToken - iOS SDK
AWS S3 Upload - Using AccessKey, SecretKey and SessionToken - iOS SDK
我正在开发 iOS 应用程序,我需要将图像上传到 AWS S3Bucket。我已经从服务器获得了临时凭证(accessKey,secretKey,sessionToken和bucketName)来上传图片。
我发现很难确定 API 使用此凭据上传图像的正确方法。
AWS示例程序使用AWSCognitoCredentialsProvider给出。
我已经得到了可以工作的 Android 版本的代码,可以将图像上传到 S3。但是我在iOS SDK中找不到对应的APIs。
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 classes
- AWSCognitoCredentialsProvider
- AWSStaticCredentialsProvider
- AWSWebIdentityCredentialsProvider
AWSStaticCredentialsProvider class 仅接受 accessKey 和 secretKey。其他 2 classes 需要不同的参数。
当我使用带 accessKey 和 secretKey 的 AWSStaticCredentialsProvider 上传图片时,我收到以下错误消息
Upload failed: [Error Domain=NSURLErrorDomain Code=-1017 "cannot parse
response" UserInfo=0x7f8773f70ee0 {NSUnderlyingError=0x7f8773f4bbb0
"The operation couldn’t be completed. (kCFErrorDomainCFNetwork error
-1017.)", NSErrorFailingURLStringKey=https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg,
NSErrorFailingURLKey=https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg,
_kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-1, NSLocalizedDescription=cannot parse response}]
此错误消息不清楚是凭据提供程序的问题还是其他问题
非常感谢任何解决此问题的帮助
谢谢
编辑
我使用了@user3467204提供的示例程序
这是带有错误消息的输出(我们的记录中不存在您提供的 AWS 访问密钥 ID)。但是使用相同的密钥,android java 代码工作正常。
Android代码使用了accessKey、secrectKey和sessionToken,但是iOS代码只使用了accessKey和secrectKey。
2015-06-01 19:42:55.747 AWSV2Test[2191:170157] Image is at /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] Uploaded 32677 / 35516 bytes
2015-06-01 19:42:56.842 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:42:56.843 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:43:00.249 AWSV2Test[2191:170157] Uploaded 32677 / 35516 bytes
2015-06-01 19:43:00.250 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:43:00.251 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:43:02.848 AWSV2Test[2191:170157] Uploaded 32677 / 35516 bytes
2015-06-01 19:43:02.849 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:43:02.850 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:43:05.285 AWSV2Test[2191:170157] Uploaded 32677 / 35516 bytes
2015-06-01 19:43:05.286 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:43:05.287 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes
2015-06-01 19:43:06.681 AWSV2Test[2191:170157] error => Error Domain=com.amazonaws.AWSS3ErrorDomain Code=3 "The operation couldn’t be completed. (com.amazonaws.AWSS3ErrorDomain error 3.)" UserInfo=0x7faea40171d0 {HostId=GeMapgMjrv43TZ4yFKmTjIw6EsZafbgk3GH9ATtbgIj1VpNNv6EjhmZhobHVm+/2, Message=The AWS Access Key Id you provided does not exist in our records., AWSAccessKeyId=ASIAIFYM7NXH3CSNXY3Q, Code=InvalidAccessKeyId, RequestId=653371138733BE48}
如果您想使用在您的服务器上生成的临时凭据,您需要实施您自己的凭据提供程序。我推荐以下方法:
- 在您的服务器上生成访问密钥、秘密密钥和会话令牌。您有许多语言选项,包括 Java、.NET、PHP、Ruby、Python 和 Node.js.
- 通过符合
AWSCredentialsProvider
来实施您的凭据提供程序。以 AWSWebIdentityCredentialsProvider
和 AWSCognitoCredentialsProvider
的实现为例。该凭证提供者应该:
- 从您的服务器检索访问密钥、秘密密钥和会话密钥。
- 在本地保留它们直到它们过期。
- Return 请求时的凭据。
- 如果它们已过期,请从您的服务器重新检索它们。
- 调用
- refresh
时启动凭据刷新过程。
我鼓励你看一看 Amazon Cognito Identity。借助 Amazon Cognito,您可以使用 public 登录提供商(例如 Amazon、Facebook、Google 和任何 OpenID Connect 兼容提供商,或使用您自己的用户,创建用于访问 AWS 云服务的唯一最终用户标识符身份系统。它涵盖了许多自定义凭据提供程序用例,并且更易于使用和管理。
我正在开发 iOS 应用程序,我需要将图像上传到 AWS S3Bucket。我已经从服务器获得了临时凭证(accessKey,secretKey,sessionToken和bucketName)来上传图片。
我发现很难确定 API 使用此凭据上传图像的正确方法。
AWS示例程序使用AWSCognitoCredentialsProvider给出。
我已经得到了可以工作的 Android 版本的代码,可以将图像上传到 S3。但是我在iOS SDK中找不到对应的APIs。
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 classes
- AWSCognitoCredentialsProvider
- AWSStaticCredentialsProvider
- AWSWebIdentityCredentialsProvider
AWSStaticCredentialsProvider class 仅接受 accessKey 和 secretKey。其他 2 classes 需要不同的参数。
当我使用带 accessKey 和 secretKey 的 AWSStaticCredentialsProvider 上传图片时,我收到以下错误消息
Upload failed: [Error Domain=NSURLErrorDomain Code=-1017 "cannot parse response" UserInfo=0x7f8773f70ee0 {NSUnderlyingError=0x7f8773f4bbb0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1017.)", NSErrorFailingURLStringKey=https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg, NSErrorFailingURLKey=https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-1, NSLocalizedDescription=cannot parse response}]
此错误消息不清楚是凭据提供程序的问题还是其他问题
非常感谢任何解决此问题的帮助
谢谢
编辑
我使用了@user3467204提供的示例程序
这是带有错误消息的输出(我们的记录中不存在您提供的 AWS 访问密钥 ID)。但是使用相同的密钥,android java 代码工作正常。
Android代码使用了accessKey、secrectKey和sessionToken,但是iOS代码只使用了accessKey和secrectKey。
2015-06-01 19:42:55.747 AWSV2Test[2191:170157] Image is at /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] Uploaded 32677 / 35516 bytes 2015-06-01 19:42:56.842 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:42:56.843 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:43:00.249 AWSV2Test[2191:170157] Uploaded 32677 / 35516 bytes 2015-06-01 19:43:00.250 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:43:00.251 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:43:02.848 AWSV2Test[2191:170157] Uploaded 32677 / 35516 bytes 2015-06-01 19:43:02.849 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:43:02.850 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:43:05.285 AWSV2Test[2191:170157] Uploaded 32677 / 35516 bytes 2015-06-01 19:43:05.286 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:43:05.287 AWSV2Test[2191:170157] Uploaded 35516 / 35516 bytes 2015-06-01 19:43:06.681 AWSV2Test[2191:170157] error => Error Domain=com.amazonaws.AWSS3ErrorDomain Code=3 "The operation couldn’t be completed. (com.amazonaws.AWSS3ErrorDomain error 3.)" UserInfo=0x7faea40171d0 {HostId=GeMapgMjrv43TZ4yFKmTjIw6EsZafbgk3GH9ATtbgIj1VpNNv6EjhmZhobHVm+/2, Message=The AWS Access Key Id you provided does not exist in our records., AWSAccessKeyId=ASIAIFYM7NXH3CSNXY3Q, Code=InvalidAccessKeyId, RequestId=653371138733BE48}
如果您想使用在您的服务器上生成的临时凭据,您需要实施您自己的凭据提供程序。我推荐以下方法:
- 在您的服务器上生成访问密钥、秘密密钥和会话令牌。您有许多语言选项,包括 Java、.NET、PHP、Ruby、Python 和 Node.js.
- 通过符合
AWSCredentialsProvider
来实施您的凭据提供程序。以AWSWebIdentityCredentialsProvider
和AWSCognitoCredentialsProvider
的实现为例。该凭证提供者应该:- 从您的服务器检索访问密钥、秘密密钥和会话密钥。
- 在本地保留它们直到它们过期。
- Return 请求时的凭据。
- 如果它们已过期,请从您的服务器重新检索它们。
- 调用
- refresh
时启动凭据刷新过程。
我鼓励你看一看 Amazon Cognito Identity。借助 Amazon Cognito,您可以使用 public 登录提供商(例如 Amazon、Facebook、Google 和任何 OpenID Connect 兼容提供商,或使用您自己的用户,创建用于访问 AWS 云服务的唯一最终用户标识符身份系统。它涵盖了许多自定义凭据提供程序用例,并且更易于使用和管理。