【问题标题】:Why Authorization header gets removed in iOS PATCH requests?为什么授权标头在 iOS PATCH 请求中被删除?
【发布时间】:2016-09-15 12:29:59
【问题描述】:

那里。我遇到了一个非常奇怪的问题。问题是,当我尝试发送 PATCH 请求时,服务器说没有授权标头包含令牌。 PUT 请求也是如此。尝试嗅探并发现根本没有发送授权标头。而任何其他类型的请求都包含授权标头。首先认为它的 Alamofire 框架特定问题,但是使用 NSURLConnection 请求和 NSURLSession 任务给了我同样的结果:没有发送授权头!

这是我用于 Alamofire 的代码:

Alamofire.request(.PATCH, path, parameters: ["email":"new@mail.com"],     encoding: .JSON, headers: ["Authorization":"token \    ((User.sharedUser().token)!)"]).validate().responseJSON { (response) in
            if response.response?.statusCode == 200{
                print("success")
            }else{
                print("Error")
            }
        }

这是带有 NSURLConnection 的代码:

let request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
request.HTTPMethod = "PATCH"
request.addValue("\(token)", forHTTPHeaderField: "authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

do{
    let bodyData = try NSJSONSerialization.dataWithJSONObject(["email":"nuv@gmail.com"], options: [])
    request.HTTPBody = bodyData
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue())
    {
        (response, data, error) in
        if let mdata = data {
            let contents = NSString(data:data, encoding:NSUTF8StringEncoding)
            print(contents)
        } else {
            print(error?.localizedDescription)
        }
        }
}catch{
    print("failed serialization")
}

【问题讨论】:

    标签: ios swift nsurlconnection alamofire


    【解决方案1】:

    IIRC,Authorization 标头是 NSURLSession 为自己的目的而保留的标头之一,并且可能会被其自己的值覆盖 - 特别是在您发送看起来像普通 HTTP 身份验证的内容时。

    您可以发送X-Authorization 标头吗?

    【讨论】:

    • 感谢您的回复)是的,我可以使用任何其他标题,但为什么没有记录?为什么它开始仅对 PUT 和 PATCH 请求使用授权标头?它完全删除了授权标头,而不是使用它(嗅探流量)。谢谢)
    • 它实际上是有记录的。在developer.apple.com/reference/foundation/… 搜索“Reserved HTTP Headers”,您会找到它。
    • 这是您有时可以逃避的事情之一,因此会导致错误的安全感。然后,当您发送一些看起来太像基本身份验证或其他内容的东西时,它会突然被踩在脚下。可能值得提交一个错误来请求委托方法以让您更直接地控制该标头字段。
    【解决方案2】:

    任何正在寻找 Alamofire 5(AF 5) 解决方案的人都可以在这里找到解决方案:

    let headers: [String:String] = [...]
    let params: [String: Any] = [...]
    let url = URL(...)
    let redirector = Redirector(behavior: Redirector.Behavior.modify({ (task, urlRequest, resp) in
      var urlRequest = urlRequest
      headers.forEach { header in
        urlRequest.addValue(header.value, forHTTPHeaderField: header.key)
      }
      return urlRequest
      }))
      //use desired request func of alamofire and your desired enconding
      AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers)
                .responseJSON { response in
                    //handleDataResponse...
                }.redirect(using: redirector)
    

    【讨论】:

    • @John 很高兴听到这个消息 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2023-04-10
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多