Tom Söderlund
Tom Söderlund

Reputation: 4747

How to add an Auth Token in every request using AFIncrementalStore?

I have an iOS + Rails 3.1 app, and I'm using AFIncrementalStore for the client-server communication.

I have implemented Token Authentication on my Rails server according to this tutorial: http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/

I now want to include the &auth_token=XXXXXXXX in every request from client to server, including POST requests. How would I do that? I haven't found the solution in this related post: Using AFIncrementalStore with an Auth token

UPDATE: this is my first code attempt, but doesn't seem to send the auth_token:

(inside my AFIncrementalStoreHTTPClient sub-class)

- (NSMutableURLRequest *)requestForFetchRequest:(NSFetchRequest *)fetchRequest withContext:(NSManagedObjectContext *)context {
    NSMutableURLRequest *request = [[super requestForFetchRequest:fetchRequest withContext:context] mutableCopy];
    NSMutableString *requestBody = [[NSMutableString alloc] initWithData:[request HTTPBody] encoding:NSUTF8StringEncoding];
    [requestBody appendFormat:@"&%@=%@", @"auth_token", @"xkT2eqqdoNp5y4vQy7xA"];
    [request setHTTPBody:[requestBody dataUsingEncoding:NSUTF8StringEncoding]];
    return request;
}

Upvotes: 0

Views: 737

Answers (1)

Aaron Brager
Aaron Brager

Reputation: 66242

UPDATE: I skimmed your question (sorry!), and my sample code below works for a regular AFHTTPClient, but not AFIncrementalStore. The same basic approach will work, though, and there's sample code at this answer that should point you in the right direction.


You can't just append &auth_token=whatever to the end of your HTTP body in all cases.

You probably want to override your getPath... and postPath... methods with something like:

- (void)getPath:(NSString *)path 
     parameters:(NSDictionary *)parameters 
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    if (parameters) {
        // Make a mutable copy and add the "token" parameter to the dictionary
        NSMutableDictionary *mutableParams = [parameters mutableCopy];
        [mutableParams setObject:@"whatever" forKey:@"token"];
        parameters = [NSDictionary dictionaryWithDictionary:mutableParams];
    } else {
        parameters = @{@"token" : @"whatever"};
    }

    [super getPath:path parameters:parameters success:success failure:failure];
}

This approach will allow AFNetworking to appropriately encode your parameters depending on your specific request and encoding settings.

If you are rolling your own AFHTTPRequestOperation objects instead of using the convenience methods (you probably aren't), just make sure you include the token in parameters before you create your NSURLRequest like so:

NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:parameters];

Upvotes: 1

Related Questions