2009-12-13 11 views
6

Estoy en una situación en la que necesito enviar autenticación (Autenticación HTTP básica) a un servidor pero el servidor no me envía un desafío primero. Esto se ha rastreado para que sea un duplicado del conmutador wget --auth-no-challenge. Mi problema es que no veo ninguna forma de hacer que NSURL haga esto.Autenticación NSURL cuando el servidor no presenta un desafío

Implementé la autenticación básica en mi delegado de NSURLConnection, pero no se está llamando al método -connection: didReceiveAuthenticationChallenge:.

¿Hay alguna manera de forzar esta llamada o incrustar la información de autenticación para esta extraña situación?

Respuesta

8

Puede agregar la información de autorización a la solicitud de forma manual mediante la adición a la cabecera de la solicitud de esta manera:

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

Cuando la solicitud es su NSMutableURLLa solicitud y el usuario/contraseña son su nombre de usuario y contraseña de NSString

He estado utilizando este enfoque con una API del iPhone donde el servidor no inicia el desafío adicional.

+0

Recibo un error cuando quiero utilizar la solución: NSData no responde a base64Encoding ". ¿Ha agregado este método usted mismo? –

+0

NSDataAdditions encontrados, incluido base64Encoding en esta respuesta: http://stackoverflow.com/questions/1417893/encrypted-nsdata-to-nsstring-in-obj-c/1417947 # 1417947 –

+0

Hola Tim, sí, he estado usando NSDataAdditions del proyecto Colloquy – paulthenerd

9

Creo que se puede añadir el nombre de usuario y contraseña para el Ejemplo NSURL

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

Piensa en cómo escapar del nombre de usuario y la contraseña. Ninguno de ellos debería f.e. contiene un caracter '@'. – SimonSimCity

0

Acabo de tropezar con esta publicación, y aunque hace algunos años acabo de implementar esta funcionalidad en iOS7 para mi aplicación que utiliza codificación incorporada base64 sin librerías de terceros.

Por lo que vale;

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"]; 
Cuestiones relacionadas