2009-12-13 7 views
6

Jestem w sytuacji, w której muszę wysłać uwierzytelnienie (podstawowe uwierzytelnienie HTTP) do serwera, ale serwer nie wysyła mi najpierw pytania. Zostało to wyśledzone, aby być duplikatem przełącznika wget --auth-no-challenge. Mój problem polega na tym, że nie widzę żadnego sposobu, aby NSURL to zrobił.Uwierzytelnianie NSURL, gdy serwer nie stanowi wyzwania

Wprowadziłem podstawowe uwierzytelnianie w moim uczestniku NSURLConnection, ale metoda -connection: didReceiveAuthenticationChallenge: nie jest wywoływana.

Czy istnieje sposób na wymuszenie tego połączenia lub osadzenie informacji uwierzytelniających dla tej dziwnej sytuacji?

Odpowiedz

8

Możesz dodać informacje o autoryzacji wniosek ręcznie dodając go do nagłówka jak więc żądanie:

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

Gdzie żądanie to NSMutableURLRequest i użytkownik/hasło to Twoja nazwa użytkownika i hasło NSString's

Używam tego podejścia z API z iPhone'a, gdzie dodatkowe wyzwanie nie jest inicjowane przez serwer.

+0

Występuje błąd, gdy chcę użyć rozwiązania: NSData nie odpowiada na base64Encoding ". Czy dodałeś tę metodę samodzielnie? –

+0

Znaleziono NSDataAdditions, w tym base64Encoding w tej odpowiedzi: http://stackoverflow.com/questions/1417893/encrypted-nsdata-to-nsstring-in-obj-c/1417947 # 1417947 –

+0

Cześć Tim, Tak, używam NSDataAdditions z projektu kolokwialnego – paulthenerd

9

wierzę, można dodać nazwę użytkownika i hasło do NSURL

przykładu

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

Pomyśl o usunięciu nazwy użytkownika i hasła. Żaden z nich nie powinien f.e. zawierają znak '@ '. – SimonSimCity

0

Właśnie natknąłem się na ten post, a wydarzenie, chociaż minęło kilka lat, właśnie zaimplementowałem tę funkcjonalność w iOS7 dla mojej aplikacji przy użyciu wbudowanego kodowania base64 bez żadnych bibliotek stron trzecich.

Za to, co warto;

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