Swift 4 - Alamofire - аутентификация NTLM работает с неверными учетными данными - PullRequest
2 голосов
/ 13 января 2020

У меня проблема с аутентификацией учетных данных NTLM, когда я использую действительные учетные данные, это работает, но когда я использую недействительные учетные данные, это не дает сбоя, оно работает так же, как и с действительными учетными данными. Это только тот случай, когда я сначала ввожу действительные учетные данные. Есть ли там, чтобы очистить учетные данные или что я здесь не так делаю? Вот мой код:

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
    {

        let user = username

        let password = password

        let url = webservice

        let credential = URLCredential(user: user, password: password, persistence: .none)

        let headers = ["Accept": "application/json;odata=verbose", "Content-type": "application/json;odata=verbose"]

        Alamofire.request(url, method: .get, headers: headers).authenticate(usingCredential: credential).responseJSON {
                (response) in

                print(response.result)

                switch response.result {

                case .success:
                    if let value = response.result.value {

                        completion(true)

                    }else{

                        print("There is error in the server response")

                        completion(false)
                    }

                case .failure (let error):

                    print("The NTLM request error is: ", error.localizedDescription)

                    completion(false)

                }

            }

    }

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

ОБНОВЛЕНИЕ

Я обновил свой код следующим образом:

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
    {

        let user = username

        let password = password

        let url = webservice

        let credential = URLCredential(user: user, password: password, persistence: .none)

        var urlRequest = URLRequest(url: URL(string: url)!)

        urlRequest.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

        urlRequest.httpMethod = "get"

        urlRequest.setValue("application/json;odata=verbose", forHTTPHeaderField: "Content-type")

        urlRequest.setValue("application/json;odata=verbose", forHTTPHeaderField: "Accept")

        Alamofire.request(urlRequest).authenticate(usingCredential: credential).responseJSON {
                (response) in

                switch response.result {

                case .success:
                    if let value = response.result.value {


                       completion(true)

                    }else{

                        print("There is error in the server response")

                        completion(false)
                    }

                case .failure (let error):

                    print("The NTLM request error is: ", error.localizedDescription)

                    completion(false)

                }

            }

    }

Чтобы добавить политику кэширования, но я все равно получаю тот же результат: (

1 Ответ

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

.failure не возвращается для ошибок HTTP. Чтобы получить ответ HTTP, который указывает, что аутентификация завершилась неудачно, вам нужно посмотреть код ответа в случае .success.

Смотрите здесь: Swift Alamofire: как получить код состояния ответа HTTP для как это сделать.

Или вы можете попасть в кеш. См .: Как отключить кеширование в Alamofire

...