Аутентификация AWS Cognito + мобильный клиент AWS + шлюз API + сегмент S3

Я создал экран входа в свое приложение с помощью AWSCognitoAuth, как в одном из приведенных примеров (https://github.com/awslabs/aws-sdk-ios-samples/tree/master/CognitoAuth-Sample). Это прекрасно работает - он показывает экран входа в систему в экземпляре SFSafariViewController, где пользователь просто входит в систему, используя обычное имя пользователя + пароль или через Facebook или Google. Итак, после этой аутентификации я получаю токены доступа и обновления, которые затем могу использовать для получения данных из моего API, которые маршрутизируются через AWS API Gateway. Соответствующие маршруты AWS API Gateway настроены для использования авторизации «Пулы пользователей» вместо «IAM».

Но теперь мне нужно загрузить некоторые файлы из ведра S3, которое не является общедоступным. Итак, что нужно сделать, это получить временные учетные данные AWS и с их помощью получить доступ к корзине. Библиотека AWSMobileClient вместе с S3 Transfer Utility могут это сделать. Но моя проблема в том, что я не знаю, как сообщить AWSMobileClient о том, что пользователь вошел в систему. AWSMobileClient инициализируется в didFinishLaunching:withOptions appDelegate следующим образом:

    let serviceConfiguration = AWSServiceConfiguration(
        region: .EUWest1,
        credentialsProvider: AWSMobileClient.sharedInstance().getCredentialsProvider()

    )

    //create a pool
    let configuration = AWSCognitoIdentityUserPoolConfiguration.init(clientId: CognitoIdentityUserPoolAppClientId, clientSecret: CognitoIdentityUserPoolAppClientSecret, poolId: CognitoIdentityUserPoolId)
    AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: configuration, forKey: AWSCognitoUserPoolsSignInProviderKey)


    AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration

    AWSFacebookSignInProvider.sharedInstance().setPermissions(["public_profile", "email"])
    AWSSignInManager.sharedInstance().register(signInProvider: AWSFacebookSignInProvider.sharedInstance())

    return AWSMobileClient.sharedInstance().interceptApplication(
        application,
        didFinishLaunchingWithOptions: launchOptions)

Дело в том, что когда я полностью закрываю приложение после входа в систему AWSCognitoAuth и снова открываю его, AWSMobileClient каким-то образом находит сеанс, учетные данные извлекаются правильно, и файл из корзины загружается. Но мне нужно как-то активировать это вручную после того, как пользователь войдет в систему, я не могу заставить пользователя выйти и снова открыть приложение, а не в 2018 году ... Я отлаживал это уже давно и копался в структуре AWSMobileClient, пытается найти, как связать этих двоих вместе, но безуспешно. Как я могу это сделать?


person gasparuff    schedule 26.11.2018    source источник
comment
Привет @gasparuff. Если у вас по-прежнему возникают проблемы с этим, начните обсуждение на репозиторий мобильного SDK на Github. Я сразу заметил, что вы используете старую версию мобильного клиента; новая версия имеет другую схему инициализации и более интуитивно понятный API для управления пользователем изменения состояния.   -  person Palpatim    schedule 27.11.2018


Ответы (1)


Но теперь мне нужно загрузить некоторые файлы из ведра S3, которое не является общедоступным. Итак, что нужно сделать, это получить временные учетные данные AWS и с их помощью получить доступ к корзине. Библиотека AWSMobileClient вместе с S3 Transfer Utility могут это сделать. Но моя проблема в том, что я не знаю, как сообщить AWSMobileClient о том, что пользователь теперь вошел в систему. AWSMobileClient инициализируется в didFinishLaunching appDelegate: withOptions

Вы уже пробовали использовать Pre-signed url? Он предназначен для удовлетворения ваших требований. Это позволяет временный доступ к ресурсам aws, в вашем случае получить доступ к ведру S3.

У вас есть образцы, использующие SDK для iOS, здесь, проверьте S3TransferUtility-Sample.

S3TransferUtility-Sample (Swift, Objective-C). Это образец мобильного приложения, демонстрирующий, как использовать построитель предварительно подписанных URL-адресов Amazon S3 для загрузки / выгрузки файлов в фоновом режиме. Участвующие сервисы AWS:

  • Амазонка S3 Амазонка
  • Cognito Identity

Надеюсь, это поможет!

person TaiT's    schedule 27.11.2018
comment
Спасибо за ваш ответ! Я использую transferUtility.downloadData(), который использует предварительно подписанный URL-адрес, как это сделано в примере проекта (точно так же, как в этом классе: github.com/awslabs/aws-sdk-ios-samples/blob/master/). Это также работает, когда я перезапускаю приложение после входа в систему, но не сразу после входа в систему с помощью AWS Cognito SDK. - person gasparuff; 27.11.2018