使用Alamofire进行基本身份validation

使用Basic Auth进行身份validation时遇到问题。 我正在使用符合URLRequestConvertible协议的标准枚举来构造我的请求。 问题是,当我在枚举中手动设置授权标头时,如下所示:

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

我总是得到401未经授权的回复。 但是,如果我使用authenticate回调设置密码,如下所示:

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

它正确validation。 我希望能够在符合URLRequestConvertible的枚举中手动设置它,而不是在authenticate中传递凭据。

我知道它正在使用NSURLCredential进行auth挑战,但我希望能够手动设置它。

这是我的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 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 } } } 

在swift 3.0中

使用以下代码 –

  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{ } } 

你可以试试这段代码:

  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) } } 
 Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON 

只是认证

最终找出问题所在。 它最终成为URL中缺少的尾随斜杠。 似乎Alamofire没有像AFNetworking那样处理它。 我能够弄清楚记录请求并发现我们在实际请求中丢失了一些字节。

与手动创建自己的标头相比,Alamofire提供了一种更简单的方法。

“基本身份validation”部分中的相关代码段:

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