URLSession丢失Authorization请求头致接口500错误求助
这是个典型的URLSession安全机制导致的问题——默认情况下,URLSession在处理HTTP重定向时会自动移除Authorization这类敏感请求头,不管重定向的目标是同域名还是跨域名,这就是为什么你手动在重定向回调里重新添加头后请求就正常了。
为什么会这样?
苹果设计这个行为是为了安全:如果你的请求被重定向到一个第三方域名,携带授权头可能会导致令牌泄露,所以默认会把这类敏感头从新请求中移除。而你的新接口大概率是触发了重定向(比如返回3xx状态码),原请求的Authorization: Token xxxx头没被带到重定向请求里,后端因为拿不到令牌验证失败,最终返回500错误。
解决方案:手动在重定向回调中添加授权头
你已经找对了方向,这里给出更完整的实现示例,确保覆盖所有情况:
Objective-C 实现
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)newRequest completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { // 1. 获取原请求的Authorization头 NSString *authHeader = task.currentRequest.allHTTPHeaderFields[@"Authorization"]; // 2. 如果原请求有授权头,就添加到重定向的新请求中 if (authHeader) { NSMutableURLRequest *modifiedRequest = [newRequest mutableCopy]; [modifiedRequest setValue:authHeader forHTTPHeaderField:@"Authorization"]; // 调用completionHandler,传入修改后的请求 completionHandler(modifiedRequest); } else { // 没有授权头的话,直接使用原重定向请求 completionHandler(newRequest); } }
Swift 实现(参考)
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { guard let authHeader = task.currentRequest?.allHTTPHeaderFields?["Authorization"] else { completionHandler(request) return } var modifiedRequest = request modifiedRequest.setValue(authHeader, forHTTPHeaderField: "Authorization") completionHandler(modifiedRequest) }
额外注意事项
- 安全验证:如果重定向的目标是跨域名,一定要确认这个域名是你信任的服务,避免把
Token泄露给不可信的第三方。 - 检查接口重定向逻辑:可以和同事确认新接口是否有必要的重定向,能不能直接调整接口逻辑避免重定向,从根源上解决问题。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

