如何在AFHTTPRequestOperationManager上将CSRF令牌添加到http头?

时间:2013-11-30 14:41:57

标签: heroku ios7 ruby-on-rails-4 afnetworking-2

我在heroku创建了一个测试应用程序(使用scaffold),我在这个heroku应用程序中构建了一个iOS客户端(使用AFNetworking 2)。我试图使用iOS应用程序从heroku中删除记录,但它无法正常工作。我从服务器收到了422状态错误。

查看heroku日志,我发现服务器正在申请CSRF令牌。所以我尝试在我的iOS客户端上使用此代码执行此操作:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.responseSerializer = [AFHTTPResponseSerializer new];

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", nil];

[manager DELETE:contact.url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Response:  %@", [operation description]) ;
    if (block) {
        block(error);
    }
    NSLog(@"Error: %@", error);
}];

它不起作用。

如何在AFHTTPRequestOperationManager上将CSRF令牌添加到http标头?

2 个答案:

答案 0 :(得分:5)

这里有两件事:

  1. 如果您的服务器抱怨缺少CSRF令牌,那么伪造一个不会是正确的解决方案。见this Stack Overflow answer for more information。虽然您刚开始启动并运行所有内容,但您可以通过在API控制器中注释掉protect_from_forgery来暂时禁用此功能。
  2. AFHTTPRequestOperationManager已初始化为AFJSONResponseSerializer,因此您无需自行设置。您可以通过X-XSRF-TOKEN
  3. 添加默认[manager.requestSerializer setValue:@"..." forHTTPHeaderField:@"..."];(或任何标题)

答案 1 :(得分:0)

使用AFNetworking2,您可以在请求序列化程序中自定义http标头。所以你需要继承你当前使用的那个并在那里添加这个逻辑。

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                               withParameters:(NSDictionary *)parameters
                                        error:(NSError *__autoreleasing *)error {
    NSMutableDictionary *modifiedParams = [parameters mutableCopy];
    modifiedParams[@"your-header-name"] = @"you-header-value";

    NSMutableURLRequest *res = [super requestBySerializingRequest:request
                                                   withParameters:modifiedParams
                                                            error:error];
    return res;
}