如何在没有Cognito的情况下从iOS上传到AWS S3?

时间:2016-05-28 16:15:01

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

我的目标:

使用最简单的代码将照片从iOS上传到常见的AWS S3存储桶

我尝试过的事情:

最佳做法的假设:

我认为Cognito是我完成所有阅读后设置图像上传的默认方式。但是,我这样做有两个问题:

  1. 对于我只需要传递图像,存储桶,密钥和秘密的内容,这似乎过于复杂。
  2. 我之前已经通过服务器完成了这项工作,只有密钥和秘密,所以我没有理由使用或支付Cognito。
  3. 我的问题:

    • 有没有办法从iOS上传到AWS S3而不使用Cognito?
    • 如果我上述任何假设或问题不是实现目标的最佳方式,那么最简单的方法是什么?

3 个答案:

答案 0 :(得分:7)

Cognito Identity是一项免费服务,因此您无需支付任何费用。此外,你真的不应该在你的应用程序中使用硬编码凭据,因为它可以很容易地反编译和检索,这不是服务器端代码的情况。

对于iOS SDK,您可以使用AWSStaticCredentialsProvider作为向任何服务客户端提供静态凭据的方式。

AWSStaticCredentialsProvider *credentialsProvider = [AWSStaticCredentialsProvider credentialsWithAccessKey:@"YourAccessKey" secretKey:@"YourSecretKey"];

再次,你真的不应该在生产应用程序中这样做。

答案 1 :(得分:3)

我建议不要在没有Cognito的情况下在Moblie应用程序中使用AWS。

如果您仍想这样做,您可以为您的存储区资源创建IAM用户设置策略,并将IAM用户凭据放入您的代码中“AWSCredentials credentials = new AWSCredentials(){

        @Override
        public String getAWSSecretKey() {
            // TODO Auto-generated method stub
            return "YOUR_SECRETKEY";
        }

        @Override
        public String getAWSAccessKeyId() {
            // TODO Auto-generated method stub
            return "YOUR_IAM_AWS_ACCESS_KEY_ID";
        }
    };

    AmazonS3 s3 = new AmazonS3Client(credentials);`

注意该方法使用危险!! 您可以设置AWS S3 Bucket权限策略S3 permission policy

答案 2 :(得分:0)

认知部分要求让这项工作免费。来自cognito FAQ

“使用Cognito Identity,用于验证用户和生成唯一标识符的联合身份证明功能始终是免费的。”

此外,AWS SDK中有一种方法AssumeRoleWithWebIdentity,它允许您使用openid连接提供程序承担AWS IAM中定义的角色。如果您没有使用开放式ID连接提供商,但您已设法使用后端进行身份验证,则可以使用 Cognito.GetOpenIdTokenForDeveloperIdentity为此用例提供令牌。

这里有一个很好的理解资源: https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication-part-2-developer-authenticated-identities/