Как создать заголовок аутентификации NTLM для использования с Alamofire?
Это заголовки запроса:
let userName = "someUserName"
let password = "aPasswordForSomeUserName"
var headers: HTTPHeaders = [
"Accept": "application/json",
]
if let authorizationHeader = Request.authorizationHeader(user: userName, password: password) {
headers[authorizationHeader.key] = authorizationHeader.value
}
Так что это порождает Authorization
как это.
Basic aC5paHFoOkulbXKhNpk43A==
(Я изменил это для безопасности).
Но когда я делаю такой же запрос в Advance Rest Client (расширение Chrome). Я вижу это:
Accept: application/json
Authorization: NTLM TlMMTVNTUAADAAAAGAAYAG4AAAAYABgAhgAAAAYABgBAAAAADAAMAEYAAAAcABwAUgPPPAAAAACeAAAAAYIAAEUARwBBAGgALgBzAGgAYQBoAUIOVABHAC4AUSDFGC4ARQBHAEEALgBMAEEAToD38IenExnddmNhyXz+u0cmIHEl/p8P9OWe2rePPsiRkZO1Ne6ZrWxnIxHK1CZcyTU=
Обратите внимание, NTLM и Basic в обоих сгенерированных ключах авторизации для моего имени пользователя и пароля.
Как это сделать в iOS (и, возможно, с Alamofire)?
Это также приводит к этому вопросу, который я задавал ранее.
1 ответ
Я добавил правильный ответ в эту ссылку и обработал любой запрос, отправленный с использованием Alamofire, вместо добавления имени входа для каждого ViewController:
private var manager : SessionManager?
var username: String? = nil
var password: String? = nil
func doesHaveCredentials() -> Bool {
self.username = Defaults[.username]
self.password = Defaults[.password]
guard let _ = self.username else { return false }
guard let _ = self.password else { return false }
return true
}
func apiManager() -> SessionManager{
if let m = self.manager{
return m
}else{
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 25
configuration.timeoutIntervalForResource = 25
self.manager = Alamofire.SessionManager(configuration: configuration)
let delegate: Alamofire.SessionDelegate = self.manager!.delegate
delegate.taskDidReceiveChallengeWithCompletion = { session, task, challenge, completionHandler in
print("Got challenge")
guard challenge.previousFailureCount == 0 else {
print("too many failures")
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM else {
print("unknown authentication method \(challenge.protectionSpace.authenticationMethod)")
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
guard self.doesHaveCredentials() else {
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
DispatchQueue.main.async {
print("Userdata not set")
};
return
}
let credentials = URLCredential(user: self.username!, password: self.password!, persistence: .forSession)
challenge.sender?.use(credentials, for: challenge)
completionHandler(.useCredential, credentials)
}
return self.manager!
}
}