AWS Cognito: проблемы при входе в систему сразу после выхода из системы

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

Я настраиваю регистрацию и логин для приложения iOS, которое использует DynamoDB и AWS Cognito. В итоге я получил регистрационный процесс регистрации, но я заметил, что всякий раз, когда я выхожу из системы, а затем немедленно пытаюсь войти в систему, приложение не может этого сделать, и я получаю сообщение об ошибке « Invalid login token. Can't pass in a Cognito token. Invalid login token. Can't pass in a Cognito token. Только после того, как я закрою и перезапустите приложение, я смогу успешно войти в систему снова.

В основном я использовал этот пример для настройки регистрации, но когда я реализовал метод входа, у меня возникли проблемы с преобразованием из Objective-C в Swift. Я не смог заставить процесс входа в систему из примера работать, поэтому вместо этого я установил явный метод входа:

 if locked { return } trimRegistrationValues() let name = usernameField.text! let user = pool!.getUser(name) lock() user.getSession(name, password: passwordField.text!, validationData: nil, scopes: nil).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (task:AWSTask!) -> AnyObject! in if task.error != nil { self.sendErrorPopup("ERROR: Unable to sign in. Error description: " + task.error!.description) } else { print("Successful Login") let loginKey = "cognito-idp.us-east-1.amazonaws.com/" + USER_POOL_ID var logins = [NSString : NSString]() self.credentialsProvider!.identityProvider.logins().continueWithBlock { (task: AWSTask!) -> AnyObject! in if (task.error != nil) { print("ERROR: Unable to get logins. Description: " + task.error!.description) } else { if task.result != nil{ let prevLogins = task.result as! [NSString:NSString] print("Previous logins: " + String(prevLogins)) logins = prevLogins } logins[loginKey] = name let manager = IdentityProviderManager(tokens: logins) self.credentialsProvider!.setIdentityProviderManagerOnce(manager) self.credentialsProvider!.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in if (task.error != nil) { print("ERROR: Unable to get ID. Error description: " + task.error!.description) } else { print("Signed in user with the following ID:") print(task.result) dispatch_async(dispatch_get_main_queue()){ self.performSegueWithIdentifier("mainViewControllerSegue", sender: self) } } return nil } } return nil } } self.unlock() return nil }) 

В настоящее время код в моем классе AppDelegate для настройки Cognito выглядит следующим образом:

 let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId:APP_CLIENT_ID, clientSecret: APP_CLIENT_SECRET, poolId: USER_POOL_ID) let pool = AWSCognitoIdentityUserPool(forKey:USER_POOL_NAME) pool.delegate = self self.storyboard = UIStoryboard(name: "Main", bundle: nil) self.credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: IDENTITY_POOL_ID, identityProviderManager:pool) let serviceConfiguration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider!) AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: USER_POOL_NAME) let manager = IdentityProviderManager(tokens: [NSString:NSString]()) self.credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: IDENTITY_POOL_ID, identityProviderManager: manager) AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = serviceConfiguration startPasswordAuthentication() 

Метод viewDidLoad() в login ViewController содержит только эту строку в отношении значений Cognito, которые я использую для входа в систему:

 if pool == nil{ pool = AWSCognitoIdentityUserPool(forKey:USER_POOL) } 

В случае prepareForSegue() из окна ViewController входа в первый вид, который видит пользователь после входа в систему, я устанавливаю пользователя, вызывая:

 destination.user = pool!.getUser(usernameField.text!) 

В методе выхода из этого представления я вызываю user!.signOut() .

Я заметил, что многие примеры проектов Cognito называют credentialsProvider.clearKeychain() после выписки, но это не решило проблему для меня. У меня возникли проблемы с поиском многих примеров, показывающих, как выйти из Cognito. Я также слышал, что учетные данные AWS истекают через час после входа в приложение, подобное этому. Каков надлежащий способ обработки учетных данных, если я хочу решить эту проблему и избежать других ситуаций, которые могут заставить моих пользователей перезапустить приложение для входа?

Interesting Posts
Давайте будем гением компьютера.