如何在没有Amazon Cognito的情况下使用AWS S3?

时间:2016-05-25 20:53:41

标签: ios node.js swift amazon-web-services amazon-s3

我正在使用Node.js REST API对我的用户进行身份验证。一旦他们通过身份验证,我就允许他们发布带有文字的照片。我的计划是将文本和URL存储到数据库中的照片中。这样,当他们转到帖子的Feed时,我的应用会查询数据库以获取文本和网址,然后使用所有网址直接从S3获取图片。这是正确的方法,如果是这样的话,如果不使用cognito,我怎么也不能这样做。我正在努力削减成本,因为我已经使用我的API添加身份验证,因此认知似乎没用。

这是我到目前为止的代码。

    let S3BucketName = "*******"

    // configure authentication with Cognito
    let CognitoPoolID = "*************"
    let Region = AWSRegionType.USEast1
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType:Region,
                                                            identityPoolId:CognitoPoolID)
    let configuration = AWSServiceConfiguration(region:Region, credentialsProvider:credentialsProvider)
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration

    let ext = "png"
    let imageURL = NSBundle.mainBundle().URLForResource("iimage", withExtension: ext)!

    let uploadRequest = AWSS3TransferManagerUploadRequest()
    uploadRequest.body = imageURL
    uploadRequest.key = NSProcessInfo.processInfo().globallyUniqueString + "." + ext
    uploadRequest.bucket = S3BucketName
    uploadRequest.contentType = "image/" + ext

    let transferManager = AWSS3TransferManager.defaultS3TransferManager()
    transferManager.upload(uploadRequest).continueWithBlock { (task) -> AnyObject! in
        if let error = task.error {
            print("Upload failed (\(error))")
        }
        if let exception = task.exception {
            print("Upload failed (\(exception))")
        }
        if task.result != nil {
            let s3URL = NSURL(string: "http://s3.amazonaws.com/\(S3BucketName)/\(uploadRequest.key!)")!
            print("Uploaded to:\n\(s3URL)")
        }
        else {
            print("Unexpected empty result.")
        }
        return nil
    }

3 个答案:

答案 0 :(得分:8)

如果没有认知,请使用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    AWSStaticCredentialsProvider *credentialsProvider = [[AWSStaticCredentialsProvider alloc] initWithAccessKey:AWS_ACCESS_KEY secretKey:AWS_SECRET_KEY];

    AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionAPSoutheast1
                                                                     credentialsProvider:credentialsProvider];

    AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
}

并上传图片使用

AWSS3TransferManager *transferManager = [AWSS3TransferManager defaultS3TransferManager];

AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new];
uploadRequest.bucket = AWS_S3_BUCKET_NAME;
uploadRequest.key = @"cards/image.png";
uploadRequest.contentType = @"image/png";
uploadRequest.body = imageURL;

[[transferManager upload:uploadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor]
                                                   withBlock:^id(AWSTask *task) {
                                                       if (task.error) {
                                                           if ([task.error.domain isEqualToString:AWSS3TransferManagerErrorDomain]) {
                                                               switch (task.error.code)
                                                               {
                                                                   case AWSS3TransferManagerErrorCancelled:
                                                                   case AWSS3TransferManagerErrorPaused:
                                                                       break;

                                                                   default:
                                                                       NSLog(@"Error: %@", task.error);
                                                                       break;
                                                               }
                                                           }
                                                           else
                                                           {
                                                               // Unknown error.
                                                               NSLog(@"Error: %@", task.error);
                                                           }
                                                       }

                                                       if (task.result)
                                                       {
                                                           AWSS3TransferManagerUploadOutput *uploadOutput = task.result;
                                                            NSLog(@"success: %@", uploadOutput);
                                                       }
                                                       return nil;
                                                   }];

答案 1 :(得分:0)

实现此目标的一种简单方法是让您的服务器生成预签名网址并将该网址发送回移动应用。如果您的服务器是用Java编写的示例是http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html。如果您的服务器使用其他语言,则所有AWS开发工具包都支持生成预签名URL。

这样,您的AWS凭证只需要在您的服务器上,并且在您对用户进行身份验证后,您可以向他们返回访问URL(将在一段时间后过期)。

请记住,如果您最终需要使用AWS进行身份验证,那么Cognito Identity API是免费的。

答案 2 :(得分:-2)

AWS S3允许未经身份验证的用户。您仍然需要设置帐户,获取存储桶以及设置策略(权限)。

转到此链接并查看服务政策。您将要查看IAM和S3。

我正在添加一个编辑。希望这会有所帮助:

使用以下内容:

    AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new];
uploadRequest.bucket = @"bucket name";  
uploadRequest.key =  fileName;
uploadRequest.body = url;  //This is a temporaryURL for the file stored at your client.  

AWSS3TransferManager *transferManager = [AWSS3TransferManager defaultS3TransferManager];

// Execute the request 
[[transferManager upload:uploadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor] withBlock:^id(AWSTask *task)
{ 
    if (task.error)
    {
        // do something
    }
    else
    {
        // do something
    }

}];

S3存储桶具有本地策略,因此您可以将其设置为允许未经身份验证的用户;当然,如果用户滥用此权限,则会向您收取存储费用。