2016-06-30 4 views
0

Я попытался использовать быстрый код, найденный here на веб-сайте, найденном here, но ответ представляет собой код html с двумя ошибками: «Вы должны ввести пароль!» и «Вы должны ввести имя пользователя!» Я новичок в NSURLSession и попытался изменить строку для аутентификации, но ничего не изменилось. Вот мой код:NSURLSession Authentication

let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
let userPasswordString = "[email protected]:password" 
let userPasswordData = userPasswordString.dataUsingEncoding(NSUTF8StringEncoding) 
let base64EncodedCredential = userPasswordData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 
let authString = "Basic \(base64EncodedCredential)" 
config.HTTPAdditionalHeaders = ["Authorization" : authString] 
let session = NSURLSession(configuration: config) 
    var running = false 
     let url = NSURL(string: "https://hac.chicousd.org/") 
     let task = session.dataTaskWithURL(url!) { 
      (let data, let response, let error) in 
      if (response as? NSHTTPURLResponse) != nil { 
       let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
       print(dataString) 
      } 
      running = false 
     } 

     running = true 
     task.resume() 

     while running { 
      print("waiting...") 
      sleep(1) 
     } 

И это в ответе консоли:

<!-- Start Error box --> 
<div id="errorContainer" class="alert alert-danger" style="display:none;"> 
<button id="portalCloseError" type="button" class="close"> &times;</button> 
<span id="errorMessage" class="error" data-pw-error="You must enter a password!" data-username-error="You must enter a User Name!"></span> 
</div> <!-- End Error box --> 

ответ

4

Есть 2 способа для входа в веб-сайт: HTTP авторизации и форма. На большинстве веб-сайтов используется более поздняя, ​​более удобная форма входа в систему. Авторизация HTTP используется только тогда, когда на сайте ожидается, что взаимодействует с пользовательской программой (нет, браузеры здесь не учитываются).

Перед вами код, вам нужно разведать сайт для того, что данные формы он посылает, как знать, полдела:

  1. Визит the school website и нажмите Cmd + Opt + C, чтобы открыть консоль разработчика.
  2. Нажмите tab.
  3. Не закрывайте эту консоль. Вернитесь на сайт и введите свое имя пользователя и пароль, как обычно.

Обратите внимание, что данные посылает страницу:

Developer Console

В виде простого текста:

checkCookiesEnabled   true 
checkMobileDevice   false 
checkStandaloneMode   false 
checkTabletDevice   false 
portalAccountUsername  email 
portalAccountPassword  password 
portalAccountUsernameLabel 

Так имя пользователя поставляется в поле под названием portalAccountUsername и пароль в portalAccountPassword. Другие поля могут быть или не быть важными.

И теперь вы можете написать код:

@IBAction func login(sender: AnyObject) { 
    let url = NSURL(string: "https://hac.chicousd.org/LoginParent.aspx")! 

    // The form parameters 
    let parameters = [ 
     "checkCookiesEnabled": "true", 
     "checkMobileDevice": "false", 
     "checkStandaloneMode": "false", 
     "checkTabletDevice": "false", 
     "portalAccountUsername": "username", 
     "portalAccountPassword": "password" 
    ] 

    let bodyString = parameters 
         .map { $0 + "=" + $1 } 
         .joinWithSeparator("&") 
         .stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())! 


    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.HTTPBody = bodyString.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     guard error == nil else { 
      print(error?.localizedDescription) 
      return 
     } 
     guard let data = data else { 
      print("empty data") 
      return 
     } 

     // This is the HTML source of the landing page after login 
     let html = String(data: data, encoding: NSUTF8StringEncoding) 
    } 
    task.resume() 
} 

По некоторым причинам, я не мог сделать запрос, пока я disabled App Transport Security. Возможно, ресурсы на этом сайте происходят из доменов, отличных от HTTPS.

+0

Один из лучших и хорошо отработанных ответов на переполнение стека, которое я видел. Это сработало. Я отредактировал мой вопрос, чтобы добавить больше деталей, потому что он проголосовал, но теперь неважно, спасибо. – Jacolack

+0

А ... спасибо! Ваша благодарность всегда ценится –