使用 Alamofire 进行基本身份验证
Basic Authentication with Alamofire
使用基本身份验证进行身份验证时遇到问题。我正在使用符合 URLRequestConvertible
协议的标准枚举来构造我的请求。问题是当我像这样在枚举中手动设置授权 headers 时:
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)
}
它验证正确。我希望能够在符合 URLRequestConvertible
的枚举中手动设置它,而不是在 authenticate
.
中传递凭据
我知道它在后台使用 NSURLCredential
进行身份验证挑战,但我希望能够手动设置它。
这是我的 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
}
}
}
您可以试试这个代码:
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)
}
}
终于明白是什么问题了。它最终成为 URL 中缺少的尾随正斜杠。 Alamofire 似乎不像 AFNetworking 那样处理它。我能够弄清楚记录请求并看到我们在实际请求中丢失了一些字节。
在swift3.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{
}
}
Alamofire 提供了一种比手动创建自己的方法更简单的方法 headers。
"Basic Auth" 部分的相关代码 here:
manager.request(.GET, "https://api.parse.com/1/classes/Spot/")
.authenticate(user: username, password: password)
.responseSpotsArray { response in
completionHandler(response.result)
}
Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON
JUST authenticate
Swift 4
private func getHeaders() -> [String: String] {
let userName = "xxxx"
let password = "xxxx"
let credentialData = "\(userName):\(password)".data(using: .utf8)
guard let cred = credentialData else { return ["" : ""] }
let base64Credentials = cred.base64EncodedData(options: [])
guard let base64Date = Data(base64Encoded: base64Credentials) else { return ["" : ""] }
return ["Authorization": "Basic \(base64Date.base64EncodedString())"]
}
使用基本身份验证进行身份验证时遇到问题。我正在使用符合 URLRequestConvertible
协议的标准枚举来构造我的请求。问题是当我像这样在枚举中手动设置授权 headers 时:
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)
}
它验证正确。我希望能够在符合 URLRequestConvertible
的枚举中手动设置它,而不是在 authenticate
.
我知道它在后台使用 NSURLCredential
进行身份验证挑战,但我希望能够手动设置它。
这是我的 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
}
}
}
您可以试试这个代码:
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)
}
}
终于明白是什么问题了。它最终成为 URL 中缺少的尾随正斜杠。 Alamofire 似乎不像 AFNetworking 那样处理它。我能够弄清楚记录请求并看到我们在实际请求中丢失了一些字节。
在swift3.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{
}
}
Alamofire 提供了一种比手动创建自己的方法更简单的方法 headers。
"Basic Auth" 部分的相关代码 here:
manager.request(.GET, "https://api.parse.com/1/classes/Spot/")
.authenticate(user: username, password: password)
.responseSpotsArray { response in
completionHandler(response.result)
}
Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON
JUST authenticate
Swift 4
private func getHeaders() -> [String: String] {
let userName = "xxxx"
let password = "xxxx"
let credentialData = "\(userName):\(password)".data(using: .utf8)
guard let cred = credentialData else { return ["" : ""] }
let base64Credentials = cred.base64EncodedData(options: [])
guard let base64Date = Data(base64Encoded: base64Credentials) else { return ["" : ""] }
return ["Authorization": "Basic \(base64Date.base64EncodedString())"]
}