Не может аутентифицировать пользователя для aws appsync с помощью Swift SDK

Я пытаюсь подключиться к своему сервису AWS AppSync из своего мобильного приложения Swift с помощью AWS Swift SDK, но продолжаю получать следующую ошибку:

Error occurred: (401 unauthorized) Did not receive a successful HTTP code.

Я использую пулы пользователей и все настроил, следуя инструкциям по быстрой настройке. У меня вопрос: как включить в свой запрос конфигурационный файл AppSync.json, созданный в консоли? Это не упоминается в руководстве и может быть причиной того, что я не могу подключиться.

Файл json выглядит так:

{
    "graphqlEndpoint": "my_endpoint_url",
    "region": "us-east-1",
    "authenticationType": "AMAZON_COGNITO_USER_POOLS",
    "apiKey": null
}

На данный момент я использую следующую конфигурацию:

// Set up  Amazon Cognito credentials
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: CognitoIdentityRegion,
                                                        identityPoolId: CognitoIdentityPoolId, identityProviderManager: pool)
// You can choose your database location, accessible by SDK
let databaseURL = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent(database_name)

do {
    // Initialize the AWS AppSync configuration

    let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL,
                                                          serviceRegion: AppSyncRegion,
                                                          credentialsProvider: credentialsProvider,
                                                          databaseURL:databaseURL)

    appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig)
    // Set id as the cache key for objects
    appSyncClient?.apolloClient?.cacheKeyForObject = { $0["id"] }
} catch {
    print("Error initializing appsync client. \(error)")
}

РЕДАКТИРОВАТЬ # 1

Оказывается, в примере используется метод ключа API, а не пулы пользователей. Итак, теперь я изменил конфигурацию на:

let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL, serviceRegion: AppSyncRegion, userPoolsAuthProvider: CognitoUserPoolsAuthProvider(pool: pool))

Проблема в том, что теперь сообщение:

Use of unresolved identifier 'CognitoUserPoolsAuthProvider'

если я попробую:

let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL, serviceRegion: AppSyncRegion, userPoolsAuthProvider: AWSCognitoUserPoolsAuthProvider(pool: pool))

ошибка:

'AWSCognitoUserPoolsAuthProvider' cannot be constructed because it has no accessible initializers

Не уверен, как удовлетворить аргумент userPoolsAuthProvider: в config.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
813
1

Ответы 1

Чтобы решить вашу конкретную проблему, userPoolsAuthProvider должен принять класс, расширяющий протокол AWSCognitoUserPoolsAuthProvider. Таким образом, ваш экземпляр будет выглядеть примерно так:

 let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL,
                                                          serviceRegion: AppSyncRegion,
                                                          userPoolsAuthProvider: self,
                                                          databaseURL:databaseURL)

А затем в классе, в котором вы создаете AppSyncClient, вы бы расширили его следующим образом:

extension YourClass: AWSCognitoUserPoolsAuthProvider {
  func getLatestAuthToken() -> String {
    var token: String = ""

    // pool is an instance of AWSCognitoIdentityUserPool
    self.pool?.currentUser()?.getSession().continueOnSuccessWith(block: { (task) -> Any? in 
      token = task.result!.idToken!.tokenString
      return nil
    }).waitUnitFinished()
  }

  return token
}

Также я считать конфигурация AppSync по умолчанию ищет файл awsconfiguration.json в вашем проекте. Вы опубликовали это некоторое время назад, поэтому, возможно, что-то изменилось с сервисами AWS и AppSync.

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

.waitUntilFinished блокирует основной поток. время от времени это вызывает значительное отставание приложения и предупреждения отладчика. также вам необходимо развернуть дополнительный токен в опубликованном вами коде, и если он равен нулю, это приведет к сбою.

alionthego 01.04.2019 11:02

Все верные утверждения. Но, надеюсь, это помогло вам продвинуться дальше

John Murphy 01.04.2019 16:39

Другие вопросы по теме