14

I am trying to pass access token in Alamofire but getting confuse in various methods around web.

Below are methods which we need to use.

let todosEndpoint: String = "https:url......."

let headers = [
            "Authorization": "Bearer \(token!)",
            "Content-Type": "application/X-Access-Token"
        ]
        let Auth_header    = [ "Authorization" : tokenString! ]

        Alamofire.request(todosEndpoint, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: Auth_header)
            .responseJSON { response in
                print("response.request \(response.request)")  // original URL request
                print("response.response \(response.response)") // HTTP URL response
                print("response.data \(response.data)")     // server data
                print("response.result \(response.result)")

                print("response \(response)")

        }

    }

OR

let aManager = SessionManager()
        aManager.session.configuration.httpAdditionalHeaders = [
            "Authorization": "Bearer tokenString"]

OR

let headerss = [
            "Authorization": tokenString]

OR

let aManager = SessionManager()
            aManager.session.configuration.httpAdditionalHeaders = [
                "Authorization": "Basic tokenString"]

What is proper way to pass access token?

Ketan P
  • 4,259
  • 3
  • 30
  • 36
New iOS Dev
  • 1,937
  • 7
  • 33
  • 67
  • choose one. did it work? good, done. It didn't work? try another. Did it work? good. done. Oh that one didn't work either? try another one. Did THAT work? Nope? Am I out of options? yes. Stackoverflow – zerohero Nov 25 '16 at 06:40
  • Isn't your first one working? – Nirav D Nov 25 '16 at 06:41
  • Unfortunately non of above is working for me? So I am not sure if I am passing token by any wrong way – New iOS Dev Nov 25 '16 at 06:45

4 Answers4

20

Did you tried this, it's available in Alamofire documentation:

let headers: HTTPHeaders = [
    "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
    "Accept": "application/json"
]

Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in
    debugPrint(response)
}

Another example is:

let user = "user"
let password = "password"

var headers: HTTPHeaders = [:]

if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {
    headers[authorizationHeader.key] = authorizationHeader.value
}

Alamofire.request("https://httpbin.org/basic-auth/user/password", headers: headers)
    .responseJSON { response in
        debugPrint(response)
    }

One more way is:

let user = "user"
let password = "password"

let credential = URLCredential(user: user, password: password, persistence: .forSession)

Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)")
    .authenticate(usingCredential: credential)
    .responseJSON { response in
        debugPrint(response)
    }
Ankit Thakur
  • 4,739
  • 1
  • 19
  • 35
  • Tokens shouldn't be set at request level... if we have 100 apis to be called in the app, user will end up adding same code for every request.... – Satyam May 17 '18 at 04:03
  • that is the correct way for authentication. it should be added in http header of each request. – Ankit Thakur May 21 '18 at 08:12
  • Please cross about session manager concept in Alamofire. Alamofire has session manager, in which we have to add the token and it in-turn adds in each http header. – Satyam May 21 '18 at 09:46
14

If you are using Alamofire 4.0 or greater, you can use RequestAdapter protocol to intercept the request and inject the JWT token. This solution is perfect if you make many requests and have to use JWT in each of them.

class AccessTokenAdapter: RequestAdapter {
    private let accessToken: String
    private let prefix: String

    public init(accessToken: String, prefix: String) {
        self.accessToken = accessToken
        self.prefix = prefix
    }

    public func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
        var urlRequest = urlRequest

        if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix(prefix) {
            urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
        }

        return urlRequest
    }
}

Somewhere in the class you initialize the SessionManager like this:

var sessionManager = SessionManager()
sessionManager.adapter = AccessTokenAdapter(accessToken: token, prefix: "https://protected.api.com")

And you use it whenever you want to:

sessionManager.request(MyRouter.getCustomData()).responseArray { (response: DataResponse<[CustomData]>) in

        if response.result.isSuccess {
            self.array = response.result.value ?? []
        } else {
            print(response.debugDescription)
        }
    }
Mariusz Wiazowski
  • 2,118
  • 1
  • 16
  • 17
6

It can be done by using Alamofire in following way:

    let url: String = "https:url......."
    var request = URLRequest(url:  NSURL(string: url)! as URL)

    // Your request method type Get or post etc according to your requirement
    request.httpMethod = "POST"

    request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")

    // Your required parameter in case of Post request
    let parameters: [String: Any] = ["paramter1": "vaue1"]

    request.httpBody = try! JSONSerialization.data(withJSONObject: parameters )

    Alamofire.request(request).responseJSON { (responseObject) -> Void in

      // Your required functionality here            

    }
H S W
  • 6,310
  • 4
  • 25
  • 36
1

I'm using look like this :-

let username = "Tuser"
let password = "Tpassword"
let credentialData = "\(username):\(password)".data(using: String.Encoding.utf8)!
let base64Credentials = credentialData.base64EncodedString(options: [])
let headers = ["Authorization": "Basic \(base64Credentials)"]

OR

let headers    = [ "Authorization" : token ]
Mitul Marsoniya
  • 5,272
  • 4
  • 33
  • 57