Objective-C登录POST请求返回403而非预期302问题排查
问题排查与修复方案
以下是你代码中存在的问题及对应修复方法:
- 缺失multipart表单的Content-Type请求头
你构造了multipart/form-data格式的请求体,也生成了边界标识boundary,但没有给请求设置对应的Content-Type头,服务器无法识别请求体格式,无法正确解析参数,这是返回403最可能的诱因。
修复代码:
// 生成boundary后添加以下代码 [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];
- 全量覆盖请求头可能丢失必要字段
你调用[request setAllHTTPHeaderFields:headers]直接全量覆盖请求头,会把NSMutableURLRequest默认生成的必要头(比如User-Agent、Content-Length等)覆盖掉,部分服务端会校验这些头,缺失会直接返回403。
修复方法:改为增量添加Cookie头,不要全量覆盖:
NSDictionary *headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies]; for (NSString *key in headers) { [request addValue:headers[key] forHTTPHeaderField:key]; }
- CSRF Token有效性问题
你从NSUserDefaults读取CSRF Token,需要确认两个点:
- 前序GET请求返回的CSRF Token是否正确存储到了
KEY_CSRF_TOKEN对应的位置,有没有可能存储的是空值、过期值 - 服务端要求的CSRF参数名是否确实是
_csrf,部分服务端会使用csrf_token、XSRF-TOKEN等其他命名
Cookie有效性问题
调用cookiesForURL时传入的是POST请求的URL,需要确认前序获取Cookie的GET请求的域名、路径、scheme和POST请求完全一致,否则无法正确读取到前序请求存储的Cookie,服务端校验Cookie不通过就会返回403。错误处理逻辑存在崩溃风险
你在请求error的分支中直接访问httpResponse.statusCode,请求发生错误时httpResponse可能为nil,此时调用会出现野指针崩溃。
修复方法:在访问statusCode前先判断httpResponse是否非空。
后续捕获302的补充说明
NSURLSession默认会自动跟随重定向,如果你要捕获302响应提取ACCESS_TOKEN,需要自定义NSURLSession,设置delegate并实现URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:方法,在方法中调用completionHandler(nil)阻止自动跳转,才能拿到302的响应头提取参数。
内容的提问来源于stack exchange,提问作者Fabrizio L.
相关产品推荐
相关产品推荐

