【问题标题】:How to add CSRF token into http header on AFHTTPRequestOperationManager?如何将 CSRF 令牌添加到 AFHTTPRequestOperationManager 上的 http 标头中?
【发布时间】:2013-12-16 13:56:00
【问题描述】:

我在 heroku 上创建了一个测试应用程序(使用脚手架),并为这个 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);
}];

没有用。

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

【问题讨论】:

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


    【解决方案1】:

    使用 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;
    }
    

    【讨论】:

      【解决方案2】:

      这里有两件事:

      1. 如果您的服务器抱怨缺少 CSRF 令牌,那么伪造一个将不是正确的解决方案。见this Stack Overflow answer for more information。当您刚刚开始让一切正常运行时,您可以通过在 API 控制器中注释掉 protect_from_forgery 调用来暂时禁用此功能。
      2. AFHTTPRequestOperationManager 已经用 AFJSONResponseSerializer 进行了初始化,所以你不需要自己设置。您可以添加默认 X-XSRF-TOKEN (或通过执行 [manager.requestSerializer setValue:@"..." forHTTPHeaderField:@"..."]; 添加任何标题

      【讨论】:

      • 非常感谢,马特! :)
      猜你喜欢
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2018-06-15
      • 2019-12-20
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多