2016-08-01 40 views
1

我在这里有这个类,里面的类是一种方法,我试图对需要Windows身份验证用户名和密码的API执行NSURLSession。我按照这里的教程https://gist.github.com/n8armstrong/5c5c828f1b82b0315e24Swift - 用于Windows身份验证的NSURLSession

以及与此想出了:

let webservice = "https://api.com" 

let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
let urlSession = NSURLSession(configuration: config) 

class WebService: NSObject { 

    func loginUser(username: String, password: String) -> Bool { 

     let userPasswordString = "[email protected]:Password" 
     let userPasswordData = userPasswordString.dataUsingEncoding(NSUTF8StringEncoding) 
     let base64EncodedCredential = userPasswordData!.base64EncodedStringWithOptions([]) 
     let authString = "Basic \(base64EncodedCredential)" 

     config.HTTPAdditionalHeaders = ["Authorization" : authString] 

     let requestString = NSString(format:"%@", webservice) as String 
     let url: NSURL! = NSURL(string: requestString) 

     let task = urlSession.dataTaskWithURL(url) { 
      (let data, let response, let error) in 
      if (response as? NSHTTPURLResponse) != nil { 
       let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
       print(dataString) 
      } 
     } 

     task.resume() 

     return true 

    } 

} 

但是当我运行此我得到一个401错误:401 - 未经授权:访问由于凭据无效被拒绝。

我已经确认API的URL是正确的。与用户名和密码相同。我究竟做错了什么?

回答

0

我能够这样做,以解决这个问题如下:

var credential: NSURLCredential! 

    func loginUser(username: String, password: String) -> Bool { 

     let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
     let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

     credential = NSURLCredential(user:username, password:password, persistence: .ForSession) 

     let requestString = NSString(format:"%@", webservice) as String 
     let url: NSURL! = NSURL(string: requestString) 

     let task = session.dataTaskWithURL(url, completionHandler: { 
      data, response, error in 

      dispatch_async(dispatch_get_main_queue(), 
      { 

       if(error == nil) 
       { 
        print("Yay!") 
       } 
       else 
       { 
        print("Naw!") 
       } 

      }) 

     }) 

     task.resume() 

     return true 

    } 

,然后加入NSURLSessionDelegate方法:

func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 

     if challenge.previousFailureCount > 0 
     { 
      completionHandler(NSURLSessionAuthChallengeDisposition.CancelAuthenticationChallenge, nil) 
     } 
     else 
     { 
      completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust:challenge.protectionSpace.serverTrust!)) 
     } 

    } 

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 

     completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential,credential) 

    } 
+0

权。您应该避免重写授权标头,因为NSURLSession保留踩踏它的权利。在某些情况下,您可以使用X-Authorization或类似方法解决此问题,具体取决于服务支持的方式,但执行基本身份验证的正确方法是创建证书并让操作系统像您一样处理它。 – dgatwood