Я пытаюсь использовать конечную точку API, которая аутентифицируется с помощью дайджест-аутентификации. Моя цель состоит в том, чтобы не использовать AlamoFire и вместо этого использовать стандартный URLSession.
Сначала я создаю запрос и запускаю задачу
var request = URLRequest(url: url)
let task = urlSession?.dataTask(with: request, completionHandler: { (data, response, error) in
// hide network activity
DispatchQueue.main.async {
UIApplication.shared.isNetworkActivityIndicatorVisible = false
}
// log success/error
if let method = request.httpMethod, let url = response?.url?.obfuscateForPII() {
if let error = error {
DDLogError("\(method) \(url) \(error.localizedDescription)")
} else {
DDLogInfo("Success \(method) \(url)")
}
}
// pass endpoint results to completion block
completionBlock(data, response, error)
})
// run the task
if let task = task {
task.resume()
}
Мой класс реализует URLSessionDelegate, в котором обрабатывается задача
func urlSession(_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
if challenge.previousFailureCount == 0 {
let keyChainStore = UICKeyChainStore.init(service: kKeychainStore)
if let username = UserDefaults.standard.value(forKey: kUsername) as? String,
let password = keyChainStore[kPassword] {
let credentials = URLCredential(user: username, password: password, persistence: .forSession)
completionHandler(.useCredential, credentials)
}
} else {
completionHandler(.performDefaultHandling, nil)
}
}
Моя проблема в том, что когда я достигаю конечной точки, я получаю ответ 401. Когда я просматриваю ответ, возвращающийся, я вижу заголовок www-authenticate, но он не содержит правильную информацию о дайджесте.
Как правильно использовать конечную точку с проверкой подлинности дайджеста, не полагаясь на AlamoFire?