Basic Authentication with Alamofire

24,138

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())"]
    }
Share:
24,138

Related videos on Youtube

Walter Martin Vargas-Pena
Author by

Walter Martin Vargas-Pena

Updated on October 09, 2020

Comments

  • Walter Martin Vargas-Pena
    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 in authenticate.

    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
      Victor Sigler over 8 years
      Please share how you're making your request using your mutableURLRequest header using Alamofire
    • Walter Martin Vargas-Pena
      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 from Alamofire
    • Walter Martin Vargas-Pena
      Walter Martin Vargas-Pena over 8 years
      @VictorSigler any idea?
  • Dara Tith
    Dara Tith over 8 years
    Thank Jesus, it helps me alots.
  • Walter Martin Vargas-Pena
    Walter Martin Vargas-Pena over 8 years
    Thanks 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
    Dipen Chudasama almost 8 years
    Please 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
    Sven Driemecker almost 6 years
    This answer is too easy :D
  • Dielson Sales
    Dielson Sales about 5 years
    iOS may not send the Authorization header when you set it directly. See developer.apple.com/documentation/foundation/nsurlrequest