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

我正在使用Node.js REST API来authentication我的用户。 一旦他们被authentication,我让他们张贴照片与文字。 我的计划是将文本和url存储到数据库中的照片。 这样,当他们去的post的饲料,我的应用程序将查询数据库获取文本和URL的,然后使用所有的URL从S3直接获取图像。 这是做这件事的正确方法吗?如果是这样的话,如果没有使用cognito,我怎么办呢? 我试图削减成本,似乎认知将是无用的,因为我已经添加了我的APIauthentication。

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

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 } 

因为没有认识的使用这个

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

一个简单的方法就是让你的服务器生成一个预先登记的URL并将该URL发送回移动应用程序。 如果您的服务器是用Java编写的,则示例为http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html 。 如果您的服务器使用其他语言,则所有AWS软件开发工具包都支持生成预定义的URL。

这样,您的AWS证书只需要在您的服务器上,并且在对用户进行身份validation之后,您可以将其授予访问URL(在一段时间后过期)。

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

AWS S3允许未经身份validation的用户。 您仍然需要build立一个帐户,获取一个存储桶,并设置策略(权限)。

转到此链接并查看服务政策。 你会想看看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存储区具有本地策略,因此您可以将其设置为允许未经身份validation的用户; 当然,如果用户滥用这个访问权限,您将被收取存储费用。