ConnorB
ConnorB

Reputation: 406

How do I use AWS S3 without Amazon Cognito?

I am using a Node.js REST API to authenticate my users. Once they are authenticated I allow them to post photos with text. My plan is to store the text and the URL to the photo in the database. That way when they go to the feed of posts, my app will query the database to get the text and URL's and then use all of the URL's to get the images from S3 directly. Is this the correct way to do it and if so how come I can not do so without using cognito. I am trying to cut costs and it seems like cognito would be useless since I already add authentication with my API.

Here is the code I have thus far.

    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
    }

Upvotes: 5

Views: 3030

Answers (3)

Heena Mulla
Heena Mulla

Reputation: 196

For without cognito use this in

- (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;
}

and for uploading image use

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;
                                                   }];

Upvotes: 9

WestonE
WestonE

Reputation: 802

One easy way to accomplish this is to have your server generate a presigned URL and send that URL back to the mobile app. An example if your server is written in Java is http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html . All of the AWS SDKs support generating a presigned URL if your server is in another language.

This way your AWS credentials need only be on your server, and after you have authenticated your users you can give them back the URL for access (which will expire after a set period of time).

Keep in mind if you do end up needing to authenticate with AWS down the road that the Cognito Identity APIs are free.

Upvotes: 0

digitalR
digitalR

Reputation: 11

AWS S3 allows unauthenticated users. You still have to set up an account, obtain a bucket, and set policies (permissions).

Go to this link and review the services policies. You'll want to look at IAM and S3.

I am adding an edit. Hopefully this helps:

Use the following:

    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
    }

}];

The S3 bucket has local policies so that you can set it up to allow unauthenticated users; you are charged for the storage, of course, if the user abuses this access.

Upvotes: -2

Related Questions