Autenticación básica con Alamofire

Experimentar un problema al autenticar con Basic Auth. Estoy usando una enumeración estándar que se ajusta al protocolo URLRequestConvertible para build mis requestes. El problema es que cuando configuré manualmente los encabezados de autorización en la enumeración de la siguiente manera:

  let user = *** let password = *** let cnetworkingentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! let base64Cnetworkingentials = cnetworkingentialData.base64EncodedStringWithOptions([]) mutableURLRequest.setValue("Basic \(base64Cnetworkingentials)", forHTTPHeaderField: "Authorization") 

Siempre obtengo una respuesta 401 no autorizada. Sin embargo, si configuro la contraseña con authenticate callback como:

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

Se autentica correctamente. Me gustaría poder configurarlo manualmente en la enumeración conforme a URLRequestConvertible lugar de pasar las cnetworkingenciales en authenticate .

Sé que está utilizando un NSURLCnetworkingential bajo el capó para los desafíos de authentication, pero me gustaría poder configurarlo manualmente.

Aquí está mi implementación URLRequestConvertible :

 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 = "easy@test.com" let password = "test" let cnetworkingentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! let base64Cnetworkingentials = cnetworkingentialData.base64EncodedStringWithOptions([]) mutableURLRequest.setValue("Basic \(base64Cnetworkingentials)", forHTTPHeaderField: "Authorization") */ mutableURLRequest.setValue(CheckedUpAPI.APIKey, forHTTPHeaderField: "API-Key") switch self { case .UpdatePatient(_, let parameters): return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0 } } } 

En swift 3.0

Use el siguiente código:

  let user = *** let password = *** let cnetworkingentialData = "\(user):\(password)".data(using: String.Encoding.utf8)! let base64Cnetworkingentials = cnetworkingentialData.base64EncodedString(options: []) let headers = ["Authorization": "Basic \(base64Cnetworkingentials)"] Alamofire.request(customerURL, method: .get, parameters: nil, encoding: URLEncoding.default, headers:headers) .validate() .responseJSON { response in if response.result.value != nil{ print(response) }else{ } } 
  You can try this code: let user = *** let password = *** let cnetworkingentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! let base64Cnetworkingentials = cnetworkingentialData.base64EncodedStringWithOptions([]) let headers = ["Authorization": "Basic \(base64Cnetworkingentials)"] 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) } } 
 Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON 

Solo autenticar

En última instancia, descubrió cuál era el problema. Terminó siendo una barra inclinada hacia atrás que falta en la URL. Parece que Alamofire no lo maneja de la misma manera que AFNetworking. Pude averiguarlo registrando las requestes y viendo que estábamos perdiendo algunos bytes en la request real.

Alamofire proporciona un enfoque aún más fácil que crear manualmente sus propios encabezados.

La parte relevante del código de la sección "Autenticación básica" aquí :

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