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"}]];
}
}