Проверка подлинности Alamofire с использованием старых учетных данных - PullRequest
0 голосов
/ 29 января 2020

Я использую Alamofire для входа в свое приложение. Имя пользователя и пароль приходят из текстовых полей. Я могу войти в систему нормально, но если я выйду из системы и вернусь к экрану входа в систему, каждая последующая попытка входа в систему использует исходные учетные данные. Например, если я введу 'test@test.com' и 'пароль', я смогу войти, но затем, если я выйду из системы и введу 'test2@test.com' и 'test2password', он использует первые учетные данные для 'test@test.com'. Кроме того, если я введу неверные учетные данные, они всегда сообщат, что они неверны, даже после того, как я введу правильные учетные данные. Единственный способ заставить его принять другой набор учетных данных - принудительно закрыть приложение и снова открыть его. Другая часть этого заключается в том, что каждый последующий вызов других конечных точек после входа требует учетных данных пользователя. Это все работает нормально, когда я вхожу в систему, но когда я исправляю проблему с входом в систему, используя заголовок авторизации, а не метод аутентификации Alamofire, мои последующие вызовы не работают.

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

Alamofire.request("https://example.com/signin/", method: .get).authenticate(user: userName, password: password).responseJSON { response in
                if response.result.value != nil {
                    let results = response.result.value as? [[String: AnyObject]]
                    if results!.count > 0 {
                        if let dictionary = results?[0] {
                            if let userEmail = dictionary["email"] {
                                print("Signed in with: \(userEmail)")
                                sharedUser.userJSON = JSON(response.result.value!)
                                sharedUser.userEmail = self.usernameField.text!
                                sharedUser.userPassword = self.passwordField.text!
                                DispatchQueue.main.async {
                                    self.performSegue(withIdentifier: "signInSegue", sender: nil)
                                }
                            }
                        }
                    } else {
                        DispatchQueue.main.async {
                            let failedSignInAlert = UIAlertController(title: "Invalid Email or Password", message: "The information you entered is incorrect. Please verify you have the correct information and try again.", preferredStyle: .alert)
                            let failedAction = UIAlertAction(title: "OK", style: .default, handler: { (action) in
                                let cookieStorage = HTTPCookieStorage.shared
                                for cookie in cookieStorage.cookies! {
                                    cookieStorage.deleteCookie(cookie)
                                }
                                let urlCache = URLCache.shared
                                urlCache.removeAllCachedResponses()
                                self.dismiss(animated: true, completion: nil)
                            })
                            failedSignInAlert.addAction(failedAction)
                            self.present(failedSignInAlert, animated: true, completion: nil)
                        }
                    }
                } else {
                    print("SIGN IN FAILED!")
                }

                DispatchQueue.main.async {
                    self.loadingIndicator.stopAnimating()
                    self.signInButton.isEnabled = true
                }
            }

1 Ответ

0 голосов
/ 30 января 2020

По умолчанию .authenticate использует значение URLCredential.Storage, равное .forSession, что означает, что учетные данные будут автоматически использоваться для всех задач проверки подлинности в сеансе, и Alamofire не получит возможности предоставить свой новый URLCredential. Передача значения .none может решить вашу проблему.

.authenticate(user: userName, password: password, persistence: .none)
...