如何在URLSession的HTTP头中为'Authorization'设置'Token xxxxxxxxxx'

时间:2017-06-30 09:41:47

标签: ios swift nsurlsession nsurlsessionconfiguration

我正在使用的后端API要求使用此格式的HTTP标头密钥Authorization的每个请求发送一个令牌 - Token xxxxxxxxxx

现在,我正在做以下事情。

var getRequest = URLRequest(url: url)
getRequest.addValue("Token xxxxxxxx", forHTTPHeaderField: "Authorization")

这有时会有效,有时候会在发出请求时删除标题字段Authorization。我用查尔斯代理检查了这个。

Apple's documentation说明以下内容。

  

NSURLSession对象旨在处理的各个方面   适合您的HTTP协议。因此,您不应该修改   以下标题:授权,连接,主机,WWW-身份验证

作为解决方案,许多人建议对URLSession使用didReceiveAuthenticationChallenge委托方法。

在这里,您需要传递一个URLSession.AuthChallengeDisposition实例来说明您希望如何回应质询,并通过URLCredential实例传递凭据以响应身份验证质询。

我不知道如何以及是否可以创建URLCredential个实例,该实例会为标题字段Token xxxxxxxx添加Authorization

有人可以提高知识水平,请帮我解决这个问题吗?

PS - 此问题中提到的所有代码都在Swift 3中。 This question询问类似于我的内容。但是,那里给出的答案对我不起作用。并且,在有关Apple不允许添加Authorization标题的问题下提出的一些问题没有得到答复。

编辑:

发布相关代码。

var getRequest = URLRequest(url: url)
getRequest.httpMethod = "GET"
getRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
getRequest.addValue("application/json", forHTTPHeaderField: "Accept")
let token = DataProvider.sharedInstance.token
getRequest.addValue("Token \(token)", forHTTPHeaderField: "Authorization")
let getTask = URLSession.shared.dataTask(with: getRequest) { (data, response, error) in
        if let data = data {
            print("--------GET REQUEST RESPONSE START--------")
            print("CODE: \((response as? HTTPURLResponse)?.statusCode ?? 0)")
            print("Response Data:")
            print(String(data: data, encoding: .utf8) ?? "")
            print("--------GET REQUEST RESPONSE END--------")
        }
}
getTask.resume()

在这里,我可以确认“授权”的标题字段已添加到请求的标题字典中。

但是,当我检查哪个请求命中服务器时,缺少“授权”的标头字段。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

我遇到了这个完全相同的问题,并发现我缺少一个尾部斜杠/,这是问题。

服务器正在发回301 Redirect响应。 URLSession会自动跟随重定向,但也会删除Authorization标头。这可能是由于Authorization"特殊状态"。根据{{​​1}}' documentation

  

URLSession对象旨在为您处理HTTP协议的各个方面。因此,您不应修改以下标题:

     
      
  • 授权
  •   
  • 连接
  •   
  • 主机
  •   
  • WWW验证
  •   

如果需要URLSessionConfiguration标头,请从Authorization实施urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)。该方法在重定向上传递新请求,允许您添加回头。

e.g。

URLSessionTaskDelegate

重要提示!

盲目信任重定向是一个坏主意。您应该确保您重定向到的网址与原始请求的网址相同。为简洁起见,我将其从代码示例中删除了。