You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS URLSession请求Authorization头丢失问题求助

URLSession请求中Authorization头丢失的排查思路

针对你遇到的Authorization头在日志中存在但实际请求丢失的问题,可按以下方向排查:

1. 替换allHTTPHeaderFields为逐个设置请求头

当前代码通过request.allHTTPHeaderFields = headers一次性设置所有头,这种方式可能与URLSession的默认头逻辑冲突(比如某些系统级头的优先级更高)。建议改用setValue(_:forHTTPHeaderField:)逐个设置:

// 替换APIRequest扩展中的urlRequest方法
func urlRequest(with baseURL: URL) -> URLRequest {
    let url = baseURL.appendingPathComponent(path)
    var request = URLRequest(url: url)
    request.httpMethod = method
    // 逐个设置头,避免覆盖或冲突
    headers.forEach { key, value in
        request.setValue(value, forHTTPHeaderField: key)
    }
    request.httpBody = body ?? encodeParameters()
    return request
}

2. 修正APIRouter中Authorization头的赋值逻辑

你的代码中guard let token的else分支未退出,若token不存在会导致"Bearer \(token)"中token为可选值(编译层面本应报错,可能实际运行中token始终存在,但逻辑存在隐患)。修正为:

case .getAllMovies:
    guard let token = session.currentUserData?.token.trimmingCharacters(in: .whitespacesAndNewlines) else {
        print("Token missing")
        return headers
    }
    headers[APIHeaders.authorization] = "Bearer \(token)"

确保只有当token有效时才添加Authorization头,避免生成格式无效的头内容。

3. 检查URLSession配置与代理逻辑

  • 若使用自定义URLSessionConfiguration,确认未通过httpAdditionalHeaders设置冲突的Authorization头;
  • 排查是否存在自定义URLProtocol拦截请求并修改/移除了Authorization头;
  • 若开启了重定向,URLSession默认可能在跨域重定向时不携带Authorization头,可通过实现URLSessionTaskDelegate的willPerformHTTPRedirection方法,手动在重定向请求中添加该头。

4. 用抓包工具验证实际发送的请求

Xcode打印的是构建阶段的URLRequest头,但URLSession实际发送时可能会修改头信息。使用Charles、Wireshark等工具抓包,确认请求离开设备时Authorization头是否真的存在,这能区分是客户端问题还是服务器/中间件问题。

5. 排查服务器端或中间件的过滤规则

部分服务器、反向代理(如Nginx)或安全中间件会拦截或过滤Authorization头,可尝试将头名临时改为其他值(如X-Authorization)测试服务器是否能接收,若能接收则说明服务器端存在针对Authorization头的特殊处理。

内容的提问来源于stack exchange,提问作者Mzalendo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:40:18