2016-02-18 26 views
7

Ein Problem beim Authentifizieren mit Basic Auth. Ich verwende ein Standard-Enum, das dem Protokoll URLRequestConvertible entspricht, um meine Anfragen zu erstellen. Das Problem ist, dass, wenn ich manuell die Berechtigungsüberschriften in der ENUM-Set wie so:Grundlegende Authentifizierung mit Alamofire

let user = *** 
    let password = *** 

    let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! 
    let base64Credentials = credentialData.base64EncodedStringWithOptions([]) 

    mutableURLRequest.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization") 

ich immer eine 401 nicht autorisierte Antwort. jedoch wenn stelle ich das Passwort des authenticate Rückruf wie so mit:

Alamofire.request(request) 
     .authenticate(user: "USERNAME_HERE", password: "PASSWORD_HERE") 
     .responseJSON { (response) -> Void in 
      print("JSON response \(response)") 
      completion(success: true, error: nil) 
    } 

Es richtig authentifiziert. Ich möchte es in der enum entsprechend URLRequestConvertible manuell setzen können, anstatt die Berechtigungsnachweise in authenticate zu übergeben.

Ich weiß, es ist mit einem NSURLCredential unter der Haube für Auth Herausforderungen, aber ich möchte in der Lage sein, es manuell einzustellen.

Hier ist meine URLRequestConvertible Umsetzung:

enum CheckedUpAPI: URLRequestConvertible { 
    static let baseURLString = "https://***" 
    static let APIKey = "***" 
    static let APIClientName = "iPad" 


    case UpdatePatient(String, [String: AnyObject]) 


    var method: Alamofire.Method { 
     switch self { 
     case .UpdatePatient: 
      return .PATCH 
     } 
    } 

    var path: String { 
     switch self { 
     case .UpdatePatient(let patientID, _): 
      return "patients/\(patientID)" 
     } 
    } 

    // MARK: URLRequestConvertible 

    var URLRequest: NSMutableURLRequest { 
     let URL = NSURL(string: CheckedUpAPI.baseURLString)! 
     let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path)) 
     mutableURLRequest.HTTPMethod = method.rawValue 


/** 
     We are not setting any authorization headers since they requests return 401 
     the `authenticate` function on Alamofire.request does the trick 

     let user = "[email protected]" 
     let password = "test" 

     let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! 
     let base64Credentials = credentialData.base64EncodedStringWithOptions([]) 

     mutableURLRequest.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization") 
*/ 
     mutableURLRequest.setValue(CheckedUpAPI.APIKey, forHTTPHeaderField: "API-Key") 

     switch self { 
     case .UpdatePatient(_, let parameters): 
      return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0 
     } 
    } 
} 
+0

Bitte teilen authentifizieren, wie Sie Ihre Anfrage mit Ihrem 'mutableURLRequest machst' Header mit Alamofire –

+0

@VictorSigler Fertig. Die manuelle Einstellung der Header ist auskommentiert, da sie nie funktioniert hat. aber das ist, was ich versuchte, und es würde nicht funktionieren, wenn die 'authenticate' Funktion von' Alamofire' –

+0

@VictorSigler irgendeine Idee? –

Antwort

2

letztlich herausgefunden, was das Problem war. Es wurde ein fehlender Schrägstrich in der URL gefunden. Es scheint, dass Alamofire es nicht so behandelt wie AFNetworking. Ich konnte es herausfinden, indem ich die Anfragen protokollierte und sah, dass wir einige Bytes in der tatsächlichen Anfrage verloren hatten.

8

Sie diesen Code versuchen:

let user = *** 
    let password = *** 
    let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! 
    let base64Credentials = credentialData.base64EncodedStringWithOptions([]) 
    let headers = ["Authorization": "Basic \(base64Credentials)"] 

Alamofire.manager.request(.GET, stringURL,headers: headers, parameters: params as? [String : AnyObject]) 
     .responseJSON { response in 
      if (response.result.error == nil){ 
       success(data: response.result.value) 
      }else{ 
       fail(error: response.result.error) 
      } 
    } 
+0

Danke Jesus, es hilft mir Alots. –

+0

Danke für Ihre Antwort. Das würde funktionieren, aber dann wird es meinen Code mit diesem überall verstreuen. Was ich versuche zu arbeiten, es alle Netzwerk-Sachen in einer "URLRequestConvertible" Implementierung zu trennen –

+0

das ist genau der gleiche Code ich habe auskommentiert –

15

In swift 3,0

Verwenden Sie folgende Code -

let user = *** 
    let password = *** 
    let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)! 
    let base64Credentials = credentialData.base64EncodedString(options: []) 
    let headers = ["Authorization": "Basic \(base64Credentials)"] 

    Alamofire.request(customerURL, 
         method: .get, 
         parameters: nil, 
         encoding: URLEncoding.default, 
         headers:headers) 
     .validate() 
     .responseJSON { response in 
      if response.result.value != nil{      
       print(response) 
      }else{ 

      } 
    } 
0

Alamofire bietet einen noch einfacheren Ansatz als die eigenen Header manuell zu erstellen.

Das entsprechende Stück Code von "Grund Auth" Abschnitt here:

manager.request(.GET, "https://api.parse.com/1/classes/Spot/") 
    .authenticate(user: username, password: password) 
    .responseSpotsArray { response in 
     completionHandler(response.result) 
    } 
3
Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON 

GERADE

+0

Dies ist die * richtige * Antwort. – mxcl

Verwandte Themen