2009-12-13 48 views
6

我處於需要將身份驗證(基本HTTP身份驗證)發送到服務器但服務器不首先向我發送質詢的情況。這已被追查成wget開關 - auth-no-challenge的副本。我的問題是,我沒有看到任何方式讓NSURL來做到這一點。NSURL當服務器沒有提出質詢時的身份驗證

我已經在我的NSURLConnection委託中實現了基本認證,但-connection: didReceiveAuthenticationChallenge:方法沒有被調用。

有什麼辦法強制這個電話或嵌入認證信息這種奇怪的情況?

回答

8

您可以將其添加到像這樣的請求頭手動添加授權信息請求:

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

請求是你的NSMutableURLRequest和用戶名/密碼是你的用戶名和密碼NSString的

我一直在使用這種方法與iPhone的API,其中額外的挑戰不是由服務器啓動。

+0

我得到一個錯誤,當我想使用你的解決方案時:NSData不響應base64Encoding「你有沒有自己添加這個方法? – 2010-05-08 12:14:35

+0

在這個答案中找到NSDataAdditions,包括base64Encoding:http://stackoverflow.com/questions/1417893/encrypted-nsdata-to-nsstring-in-obj -c/1417947#1417947 – 2010-05-08 12:20:11

+0

Hi Tim,是的我一直在使用colloquy項目中的NSDataAdditions – paulthenerd 2010-05-09 21:09:30

9

我相信你可以將用戶名和密碼添加到NSURL

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

考慮轉義用戶名和密碼。他們都不應該f.e.包含一個'@'字符。 – SimonSimCity 2016-01-05 15:18:47

0

剛剛偶然發現了這篇文章,雖然已經過了幾年,但我只是在iOS7中爲我的應用使用內置的base64編碼實現了這個功能,而沒有任何第三方庫。

這是值得的;

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