Как выйти из системы с помощью Auth0 - PullRequest
0 голосов
/ 10 июля 2019

Я работал над интеграцией Auth0 с моим приложением.Когда я нажимаю «Вход», auth0 перенаправляет меня на предоставленный URL-адрес входа.После успешного входа я вернусь к другому ViewController.В этом контроллере просмотра у меня есть кнопка выхода, которая перенаправляет меня на страницу входа.Теперь, когда я снова нажимаю на кнопку входа, он не запрашивает учетные данные для входа в систему и переносит меня в ViewController, потому что auth0 хранит данные кэша пользователя, вошедшего в систему. Но когда я нажимаю кнопку выхода, я хочу auth0удалить данные кэша, потому что я хочу, чтобы пользователь перенаправлял на страницу входа, где пользователь должен вводить учетные данные каждый раз, когда он входит в систему. Возможно ли это?

func signIn() {
        print("Sign In")

        guard let clientInfo = plistValues(bundle: Bundle.main) else { return }
        Auth0
            .webAuth()
            .scope("openid profile")
            .audience("https://" + clientInfo.domain + "/userinfo")
            .start {
                switch $0 {
                case .failure(let error):
                    print("Error: \(error)")
                case .success(let credentials):
                    if let accessToken = credentials.accessToken, let refreshToken = credentials.refreshToken, let idToken = credentials.idToken {
                        UserDefaults.standard.setValue(accessToken, forKeyPath: "accessToken")
                        UserDefaults.standard.setValue(refreshToken, forKeyPath: "refreshToken")
                        UserDefaults.standard.setValue(idToken, forKeyPath: "idToken")

                        let loadingAlert = UIAlertController.customAlert(title: "Success", message: accessToken)
                        loadingAlert.presentInViewController(self)
                    }

                    if (!SessionController.shared.store(credentials: credentials)) {
                        print("Failed to store credentials")
                    }
                    else {
                        SessionController.shared.retrieveProfile { error in
                            DispatchQueue.main.async {
                                guard error == nil else {
                                    print("Failed to retrieve profile: \(String(describing: error))")
                                    return self.signIn()
                                }

                                let storyBoard = UIStoryboard(name: "Main", bundle: nil)
                                let vc = storyBoard.instantiateViewController(withIdentifier: "profileViewController") as! ProfileViewController
                                self.present(vc, animated: true, completion: nil)
                            }
                        }
                    }
                }
        }
    }
    @IBAction func btnActionSignOut(_ sender: UIButton) {

        let alertController = UIAlertController(title: AppSettings.shared.appName, message: "Are you sure you want to logout?", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "Yes", style: .default) { (action:UIAlertAction) in
            // Clear access tokens and logout user.
            UserDefaults.standard.setValue(nil, forKeyPath: "accessToken")
            UserDefaults.standard.setValue(nil, forKeyPath: "refreshToken")
            UserDefaults.standard.setValue(nil, forKeyPath: "idToken")

            _ = SessionController.shared.logout()
            self.dismiss(animated: true, completion: nil)
        }
        let noAction = UIAlertAction(title: "No", style: .default) { (action:UIAlertAction) in
            // Do nothing. Alert dismissed.
        }
        alertController.addAction(okAction)
        alertController.addAction(noAction)
        self.present(alertController, animated: true, completion: nil)
    }

Iожидаю, что менеджер сеансов очистит сохраненные данные и покажет мне экран входа в систему, но вместо этого мне будет позволено войти в систему без каких-либо учетных данных.

1 Ответ

0 голосов
/ 12 июля 2019

Похоже, что при выходе из системы вы очищаете токены с устройства, но фактически не перенаправляете пользователя в Auth0 Logout конечную точку https://YOUR_DOMAIN/v2/logout.

Вам потребуется перенаправить пользователя на выход из системы, чтобы гарантировать, что сеанс пользователя Auth0 и, возможно, сеанс Identity Provider (с параметром запроса federated) будут также очищены, если вы ищете истинный выход из системы с повторной аутентификацией пользователя.

Причина, по которой вы снова вошли в систему, вероятно, из-за Бесшовного единого входа . Auth0 обнаруживает, что у пользователя все еще есть действительный сеанс в этом браузере, поэтому он регистрирует пользователя, не требуя учетных данных. Единственный способ удалить cookie-файл Auth0 в этом браузере - перенаправить их в API выхода из системы выше.

...