Gabriel Mendez
Gabriel Mendez

Reputation: 1115

Objective-C and Preemptive Authentication

I am trying to get data from WebService for my Ipad App.

To do that, I am using a NSURLConnection with NSMutableURLRequest.

Web Services are published on Apache-Coyote 1.1 with Preemptive Basic Authentication, but I don't know how to send my credentials from Objective-C.

Anybody knows how can I set my user/password in Objective-C to log my clients with the Apache premptive authentication system?

Thank you.

Upvotes: 4

Views: 1443

Answers (2)

Alex Reynolds
Alex Reynolds

Reputation: 96947

Consider using the ASIHTTPRequest framework, which makes preemptive Basic authentication requests simple:

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setAuthenticationScheme:(NSString *)kCFHTTPAuthenticationSchemeBasic]; /** preemptively present credentials **/
[request setUsername:@"username"];
[request setPassword:@"password"];
[request startSynchronous];
NSError *error = [request error];
if (!error)
    NSString *response = [request responseString];

And, yes, you definitely want to do Basic authentication over SSL (i.e. via some https://... URL).

Upvotes: 0

Wayne Hartman
Wayne Hartman

Reputation: 18477

EDIT:

In order to set the creds yourself, you'll need to be able to base64 encode the username and password and set the appropriate header. Matt Gallagher, from Cocoa With Love, has a great post on how to add a category to NSData to easily do this.

NSString* username = @"username";
NSString* password = @"password";

NSString* encodedUsername = [[username dataUsingEncoding:NSUTF8StringEncoding] base64EncodedString];
NSString* encodedPassword = [[password dataUsingEncoding:NSUTF8StringEncoding] base64EncodedString];

NSURL* url = [NSURL URLWithString:@"http://yourUrl.com/"];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
NSString* headerValue = [NSString stringWithFormat:@"Basic %@:%@", encodedUsername, encodedPassowrd];
[request addValue:@"Authorization" forHTTPHeaderField:headerValue];

[NSURLConnection connectionWithRequest:request delegate:self];

As with all use of credentials, please make sure you are doing this all over HTTPS because these credentials are essentially being passed in clear text.

Upvotes: 2

Related Questions