Marcus S. Zarra
Marcus S. Zarra

Reputation: 46718

NSURL Authentication when server does not present a challenge

I am in a situation where I need to send authentication (basic HTTP Authentication) to a server but the server does not send me a challenge first. This has been tracked down to be a duplicate of the wget switch --auth-no-challenge. My problem is, I do not see any way to get NSURL to do this.

I have implemented basic authentication in my NSURLConnection delegate but the -connection: didReceiveAuthenticationChallenge: method is not getting called.

Is there any way to force this call or to embed the authentication information for this strange situation?

Upvotes: 6

Views: 4131

Answers (3)

Markus Millfjord
Markus Millfjord

Reputation: 707

Just stumbled upon this post, and event though it's been a few years I just implemented this functionality in iOS7 for my app using built-in base64-encoding without any 3rd-party libs.

For what it's worth;

NSString *credentials = [NSString stringWithFormat:@"%@:%@", username, password];
NSData* credentialsData = [NSData dataWithBytes:[credentials UTF8String] length:strlen([credentials UTF8String])];
credentials = [credentialsData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSString *authStr = [NSString stringWithFormat:@"Basic %@", credentials];
[urlRequest setValue:authStr forHTTPHeaderField:@"Authorization"];

Upvotes: 0

paulthenerd
paulthenerd

Reputation: 9507

You can add the authorization information to the request manually by adding it to the request header like so:

NSString *authString = [[[NSString stringWithFormat:@"%@:%@",user, password] dataUsingEncoding:NSUTF8StringEncoding] base64Encoding];        
[request setValue:[NSString stringWithFormat:@"Basic %@", authString] forHTTPHeaderField:@"Authorization"]; 

Where request is your NSMutableURLRequest and user/password are your respective username and password NSString's

I've been using this approach with an API from the iphone where the extra challenge is not being initiated by the server.

Upvotes: 8

epatel
epatel

Reputation: 46051

I believe you can add the username and password to the NSURL

Example

NSURL *url = [NSURL URLWithString:@"http://username:[email protected]/"];

Upvotes: 9

Related Questions