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

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

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

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

Эта ошибка возникает

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

Думаю, этого и следовало ожидать, поскольку я вышел из системы. Но проблема в том, что даже после входа в FB AWS по-прежнему считает меня Несанкционированным. Из аналогичных вопросов на StackOverflow я вижу, что в прошлом люди вручную устанавливали словарь логинов на 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
}

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

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


person Alex Ozun    schedule 10.02.2017    source источник
comment
Я использую тот же AWSIdentityManager при выходе из системы, и у меня есть такая же проблема, как и у вас. Он показывает UserInfo={__type=NotAuthorizedException, message=Unauthenticated access is not supported for this identity pool.}, но все равно успешно выйти из системы, я не знаю почему. Какие-нибудь решения?   -  person stan liu    schedule 10.05.2017
comment
Какой сервис выдает эту ошибку? Какой-нибудь AWSLambda? Или сам AWSIdentityManager?   -  person Alex Ozun    schedule 10.05.2017
comment
AWSIdentityManager. И это касается настраиваемого входа в систему, как шарма, но когда я выхожу из системы с помощью [[AWSIdentityManager defaultIdentityManager] logoutWithCompletionHandler:^(id result, NSError *error), появляется ошибка, о которой я упоминал выше. Мне нужно выполнить другую работу после того, как обнаружено, что при выходе из системы нет ошибок. Теперь я использую [[AWSIdentityManager defaultIdentityManager] isLoggedin] вместо того, чтобы выполнять другую работу, когда я обнаруживаю, что пользователь вышел из системы в обработчике выше.   -  person stan liu    schedule 12.05.2017
comment
Тем же. Вы в этом разобрались? Я просто игнорирую все возвращаемые ошибки.   -  person Bill Bunting    schedule 26.09.2018
comment
@BillBunting. В итоге я создал ветвь aws-sdk-ios и модифицировал AWSAuthCore, чтобы сам исправить эти проблемы. Я не помню, что именно я сделал, но вы можете проверить мои коммиты здесь github.com/Alex-Ozun/aws-sdk-ios/commit/reactoo   -  person Alex Ozun    schedule 28.09.2018


Ответы (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"}]];
    }
}

Подробнее.

person Rachit Dhall    schedule 10.02.2017
comment
Привет, Рахит! Я не использую специальный AWSIdentityProviderManager для создания экземпляра AWSCognitoCredentialsProvider, как вы можете видеть из моего кода. Поэтому собственной реализации метода логинов у меня нет. Вместо этого я использую расширенный поток, основанный на AWS. SDK для обработки логинов. Вот пример моего логина AWSIdentityManager.defaultIdentityManager().loginWithSign(AWSFacebookSignInProvider.sharedInstance()) { (result, error) in {} - person Alex Ozun; 11.02.2017