首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSession认证

NSURLSession认证
EN

Stack Overflow用户
提问于 2016-06-30 07:02:14
回答 1查看 711关注 0票数 1

我尝试使用在网站上找到这里的快速代码找到这里,但是响应是html代码,有两个错误:“你必须输入密码!”和“你必须输入一个用户名!”我对NSURLSession并不熟悉,我试图更改用于身份验证的字符串,但是没有任何东西可以更改响应。这是我的代码:

代码语言:javascript
复制
 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)
        }

这是控制台的响应:

代码语言:javascript
复制
<!-- 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 -->
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-01 01:54:20

有两种方式来登录一个网站: HTTP授权和表单。大多数网站使用后一种更方便用户的登录表单.只有当网站希望与用户程序交互时才使用HTTP授权(不,浏览器在这里不算)。

在编写代码之前,您需要搜索网站发送的格式数据,因为知道这是一半的战斗:

  1. 访问学校网站并按Cmd + Opt + C键打开开发人员的控制台。
  2. 单击网络选项卡。
  3. 不要关闭此控制台。回到网站,像往常一样输入你的用户名和密码。

观察页面发送的数据:

纯文本:

代码语言:javascript
复制
checkCookiesEnabled         true
checkMobileDevice           false
checkStandaloneMode         false
checkTabletDevice           false
portalAccountUsername       email
portalAccountPassword       password
portalAccountUsernameLabel

因此,用户名在一个名为portalAccountUsername的字段中传递,密码在portalAccountPassword中传递。其他领域可能重要,也可能不重要。

现在您可以编写代码了:

代码语言:javascript
复制
@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()
}

由于某些原因,我直到禁用应用程序传输安全性才能提出请求。也许该网站上的资源来自非HTTPS域。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38116022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档