2016-08-01 26 views
1

Ich habe diese Klasse hier und innerhalb der Klasse ist eine Methode, und ich versuche, eine NSURLSession auf einer API, die Windows-Authentifizierung Benutzername und Passwort benötigt. Ich habe das Tutorial hier gefolgt https://gist.github.com/n8armstrong/5c5c828f1b82b0315e24Swift - NSURLSession für Windows-Authentifizierung

und kam mit dieser:

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 

    } 

} 

aber wenn ich diese laufen bekomme ich einen 401-Fehler: 401 - nicht autorisiert: Zugriff aufgrund ungültiger Anmeldeinformationen verweigert.

Ich habe bestätigt, dass die URL der API korrekt ist. Gleiches gilt für den Benutzernamen und das Passwort. Was mache ich falsch?

Antwort

0

konnte ich dieses Problem beheben, indem Sie folgendermaßen vorgehen:

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 

    } 

und dann NSURLSessionDelegate Methoden ergänzt:

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

Rechts. Sie sollten es vermeiden, den Authorization-Header zu überschreiben, da NSURLSession sich das Recht vorbehält, darauf zu stampfen. In einigen Fällen können Sie dies umgehen, indem Sie X-Authorization oder Ähnliches verwenden, je nachdem, was der Service unterstützt, aber die richtige Art, Basisauthentifizierung durchzuführen, besteht darin, den Berechtigungsnachweis zu erstellen und ihn vom OS so behandeln zu lassen. – dgatwood