Basic-Authentifizierung mit Alamofire
Ein Problem bei der Authentifizierung mit Basic Auth. Ich bin mit einem standard-enum-entspricht URLRequestConvertible
Protokoll zu konstruieren, die meine Anfragen. Das Problem ist, wenn ich manuell den authorization-Header in der enum-wie so:
let user = ***
let password = ***
let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
mutableURLRequest.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
Bekomme ich immer einen 401 unauthorized Antwort. Jedoch wenn ich das Passwort über die authenticate
callback-wie so:
Alamofire.request(request)
.authenticate(user: "USERNAME_HERE", password: "PASSWORD_HERE")
.responseJSON { (response) -> Void in
print("JSON response \(response)")
completion(success: true, error: nil)
}
Er authentifiziert richtig. Ich möchte in der Lage sein, um es manuell in der enum-konforme URLRequestConvertible
statt übergeben Sie die Anmeldeinformationen in authenticate
.
Ich weiß, dass es mit einem NSURLCredential
unter der Haube für die auth Herausforderungen, aber ich möchte in der Lage sein, um es manuell.
Hier ist mein 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
}
}
}
- Bitte teilen Sie, wie Sie machen Sie Ihre Anfrage mit Ihrem
mutableURLRequest
header mit Alamofire - Getan. Die manuelle Einstellung der Header ist auskommentiert, da es nie funktionierte. aber das ist, was ich versucht habe und es nicht funktionieren würde, wenn mit der
authenticate
Funktion vonAlamofire
- irgendeine Idee?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In swift 3.0
Verwenden Sie folgenden code -
Können Sie versuchen, diesen code:
URLRequestConvertible
UmsetzungLetztlich herausgefunden, was das Problem war. Es endete als ein fehlenden trailing slash in der URL. Es scheint Alamofire nicht behandeln Sie die gleiche Weise AFNetworking tut. Ich war in der Lage, um es herauszufinden, Protokollierung der Anfragen und sehen, dass wir verloren einige bytes in die eigentliche Anfrage.
Alamofire bietet eine noch einfachere Methode als das manuelle erstellen Sie Ihre eigenen Header.
Den relevanten Teil des Codes von "Basic Auth" - Sektion hier:
Swift 4
Authorization
- header, wenn Sie es direkt. Siehe developer.apple.com/documentation/foundation/nsurlrequest