AWS Cognito iOS. Неаутентифицированная ошибка после выхода из системы

Я использую AWS Cognito, интегрированный с приложением iOS через MobileHub для входа через Facebook. Все работает нормально, пока я не выйду из существующей личности и не попытаюсь войти в систему с другой учетной записью FB (или даже с той же).
В этом случае я получаю эту ошибку каждый раз, когда я вызываю любую AWS Lambda:

AWSiOSSDK v2.4.9 [Ошибка] AWSCredentialsProvider.m строка:577.
Учетные данные AWSCognitoCredentialsProvider.
Невозможно обновить. Ошибка: [Ошибка домена =com.amazonaws.AWSCognitoIdentityErrorDomain Code=8 "(null)" UserInfo={__type=NotAuthorizedException, message= Доступ без аутентификации не поддерживается для этого пула идентификаторов.}]

Но если я завершу и перезапущу приложение, все снова будет работать правильно.

Эта ошибка происходит здесь:

Читая код AWS SDK, я вижу, что это происходит из-за того, что идентификация Cognito не получает логины от провайдера учетных данных:

Я предполагаю, что это ожидается, так как я вышел из системы. Но проблема в том, что даже после входа в FB AWS все равно считает меня Несанкционированным. Из похожих вопросов по Stackru я вижу, что в прошлом люди вручную устанавливали словарь логинов на AWSCognitoCredentialsProvider. Но теперь это свойство устарело, а другие подобные свойства доступны только для чтения.

Вот моя настройка AWS в AppDelegate метод didFinishLaunchingWithOptions:

let cred = AWSCognitoCredentialsProvider(regionType: .euWest1, identityPoolId: "POOLID")
let config = AWSServiceConfiguration(region: .euWest1, credentialsProvider: cred)
AWSServiceManager.default().defaultServiceConfiguration = config

if let config = config {
       config.timeoutIntervalForRequest = 30
       config.timeoutIntervalForResource = 30
       config.maxRetryCount = 3
       AWSLambdaInvoker.register(with: config, forKey: "key")
}

let mapperConfiguration = AWSDynamoDBObjectMapperConfiguration()
mapperConfiguration.saveBehavior = .updateSkipNullAttributes
AWSDynamoDBObjectMapper.register(with: config!, objectMapperConfiguration: mapperConfiguration, forKey: "updateObjectMapper")

И вот код выхода из системы:

AWSIdentityManager.defaultIdentityManager().logout { (result, error) in
   if let cp = AWSServiceManager.default().defaultServiceConfiguration.credentialsProvider as? AWSCognitoCredentialsProvider {
           cp.clearKeychain()
   }
       // Open login screen
}

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

Буду очень признателен за любую помощь!
С наилучшими пожеланиями, Алекс

1 ответ

Вы делаете это в реализации метода входа в систему?

- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    FBSDKAccessToken* fbToken = [FBSDKAccessToken currentAccessToken];
    if(fbToken){
        NSString *token = fbToken.tokenString;
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : token }];
    }else{
            return [AWSTask taskWithError:[NSError errorWithDomain:@"Facebook Login"
                                                          code:-1
                                                      userInfo:@{@"error":@"No current Facebook access token"}]];
    }
}

Подробнее

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