NSURLSessionvalidation

我试图用在这里find的网站上find的swift代码,但是回应是带有两个错误的html代码:“您必须input密码!” 和“你必须input一个用户名!” 我是NSURLSession的新手,并尝试更改string进行身份validation,但没有任何工作来改变响应。 这是我的代码:

let config = NSURLSessionConfiguration.defaultSessionConfiguration() let userPasswordString = "username@gmail.com: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 --> 

有两种login网站的方式:HTTP授权和表单。 大多数网站使用后来更方便用户的login表单。 HTTP授权仅在网站期望与用户程序交互时使用(不,浏览器不计算在这里)。

在你编码之前,你需要搜寻网站发送的表单数据,因为知道是一半的战斗:

  1. 访问学校网站 ,按Cmd + Opt + C打开开发者控制台。
  2. 点击networking标签。
  3. 不要closures这个控制台。 返回到网站并照常input您的用户名和密码。

观察页面发送的数据:

开发者控制台

用纯文本:

 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() } 

由于某些原因,我无法发出请求,直到我禁用了App Transport Security 。 也许该网站上的资源来自非HTTPS域。