Basic Authentication with Alamofire
Solution 1
Ultimately figured out what the issue was. It ended up being a missing trailing forward slash in the URL. It seems Alamofire does not handle it the same way AFNetworking does. I was able to figure it out logging the requests and seeing that we were losing some bytes in the actual request.
Solution 2
In swift 3.0
Use following 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{
}
}
Solution 3
Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON
JUST authenticate
Solution 4
You can try this code:
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)
}
}
Solution 5
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())"]
}
Related videos on Youtube
Walter Martin Vargas-Pena
Updated on October 09, 2020Comments
-
Walter Martin Vargas-Pena over 3 years
Experiencing an issue when authenticating with Basic Auth. I am using a standard enum that conforms to
URLRequestConvertible
protocol to construct my requests. The issue is that when I manually set the authorization headers in the enum like so:let user = *** let password = *** let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! let base64Credentials = credentialData.base64EncodedStringWithOptions([]) mutableURLRequest.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
I always get a 401 unauthorized response. However if I set the password using the
authenticate
callback like so:Alamofire.request(request) .authenticate(user: "USERNAME_HERE", password: "PASSWORD_HERE") .responseJSON { (response) -> Void in print("JSON response \(response)") completion(success: true, error: nil) }
It authenticates properly. I would like to be able to set it manually in the enum conforming to
URLRequestConvertible
instead of passing in the credentials inauthenticate
.I know it's using a
NSURLCredential
under the hood for auth challenges but I would like to be able to set it manually.Here is my
URLRequestConvertible
implementation :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 } } }
-
Victor Sigler over 8 yearsPlease share how you're making your request using your
mutableURLRequest
header using Alamofire -
Walter Martin Vargas-Pena over 8 years@VictorSigler Done. The manual setting of the headers is commented out since it never worked. but thats what i tried with and it would not work when using the
authenticate
function fromAlamofire
-
Walter Martin Vargas-Pena over 8 years@VictorSigler any idea?
-
-
Dara Tith over 8 yearsThank Jesus, it helps me alots.
-
Walter Martin Vargas-Pena over 8 yearsThanks for your response. This would work but then it will litter my code with this all over the place. What i;m trying to get working keeping it separating all the network stuff in a
URLRequestConvertible
implementation -
Dipen Chudasama almost 8 yearsPlease let me know In above code where I have to add my certificate path ? In my case my certificate belongs to NSBundle folder..? please help me If you know.
-
Sven Driemecker almost 6 yearsThis answer is too easy :D
-
Dielson Sales about 5 yearsiOS may not send the
Authorization
header when you set it directly. See developer.apple.com/documentation/foundation/nsurlrequest