2016-05-25 3 views
4

Я использую API REST Node.js для аутентификации моих пользователей. Как только они проходят проверку подлинности, я разрешаю им публиковать фотографии с текстом. Мой план состоит в том, чтобы сохранить текст и URL-адрес фотографии в базе данных. Таким образом, когда они перейдут на фид сообщений, мое приложение запросит базу данных, чтобы получить текст и URL, а затем использовать все URL-адреса, чтобы напрямую получать изображения с S3. Это правильный способ сделать это, и если да, то почему я не могу этого сделать, не используя cognito. Я пытаюсь сократить расходы, и похоже, что cognito будет бесполезным, поскольку я уже добавляю аутентификацию с помощью моего API.Как использовать AWS S3 без Amazon Cognito?

Вот код, который у меня есть до сих пор.

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 
    } 

ответ

-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 имеет локальную политику, так что вы можете настроить его, чтобы позволить непроверенным пользователям; вы платите за хранение, конечно, если пользователь злоупотребляет этим доступом.

+0

http://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/obtaining-permissions- for-resource-groups.html – digitalR

+1

Пользователь просит просмотреть код, если он подходит для необходимой операции. Выше ответ не является ответом на вышеупомянутый вопрос. – error2007s

+0

ОК. Я ожидал, что пользователь не захочет войти в AWS, чтобы установить политику для ведра. Код в порядке. Похоже, что он был напрямую создан генератором кода AWS. Пользователь должен войти в систему AWS, чтобы установить идентификацию без проверки подлинности. – digitalR

0

Одним из простых способов добиться этого является то, чтобы ваш сервер сгенерировал назначенный URL-адрес и отправил этот URL-адрес обратно в мобильное приложение. Пример, если ваш сервер написан на Java, - http://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html. Все SDK-файлы AWS поддерживают создание назначенного URL-адреса, если ваш сервер находится на другом языке.

Таким образом, ваши учетные данные AWS должны быть только на вашем сервере, а после того, как вы прошли аутентификацию своих пользователей, вы можете вернуть им URL-адрес для доступа (срок действия которого истекает через заданный период времени).

Имейте в виду, если вам действительно нужно пройти аутентификацию с помощью AWS по дороге, в которой API-интерфейсы Cognito Identity бесплатны.

+0

Где вы видите эти API-диски бесплатны? Я смотрю на https://aws.amazon.com/cognito/pricing/ – Yousef

7

Для использования без Cognito это

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

Большое спасибо. Это работает. Загрузка выполнена успешно, но я не вижу изображения внутри Bucket. Я что-то упускаю? –

Смежные вопросы