2016-11-22 69 views
0

我已經使用NSMutableURLRequest很長時間來連接到我的服務器。爲什麼切換到HTTPS時,我通過NSURLRequest獲得了authenticationchallenge?

爲了避免雙重roadtrips,我設置的USR /密碼馬上在頭,像這樣:

NSMutableURLRequest *request = [NSMutableURLRequest 
      requestWithURL:[NSURL URLWithString:url] 
       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:HTTP_REQUEST_TIMEOUT]; 
NSString *authStr = [NSString stringWithFormat:@"%@:%@", inUsr, inPwd]; 
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [[authStr dataUsingEncoding:NSISOLatin1StringEncoding] base64EncodedStringWithOptions:0]]; 

[request setValue:authValue forHTTPHeaderField:@"Authorization"]; 

這一直很好,在「willSendRequestForAuthenticationChallenge」是從來沒有所謂的,除非有一些錯誤,這樣的方法一直看起來像:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {   
    NSDictionary *errorInfo = ((NSHTTPURLResponse *) challenge.failureResponse).allHeaderFields; 

    NSError *error; = [NSError errorWithDomain:@"httprequesthandler" code:WRONG_CREDENTIALS userInfo:errorInfo]; 
    [delegate finishedWithErrors:error]; 

但是現在,我使用的是相同的URL的一如既往,只有「https」開頭的不是「http」,突然這個方法被調用每次。

我希望我的請求按照常規工作,即填充基本頭文件和只有一個請求到服務器。

我不確定我錯過了什麼,所以指針將非常感謝!

回答

0

使用https作爲您的方案(或協議)要求安全地進行連接,既要對傳輸的數據進行加密,也要向您提供有關您連接的服務器的真實性的信息。

在此處調用的委託方法(connection:willSendRequestForAuthenticationChallenge:)與您在服務器上進行身份驗證無關,但服務器會與您進行身份驗證。如果您深入瞭解挑戰對象(NSURLAuthenticationChallenge),您可以找到服務器提供的憑據,讓您知道它是您實際嘗試連接的服務器,而不是冒名頂替者。

通常情況下,你不需要使用這種方法,除非你想以超越操作系統已經做的事情來驗證服務器。

+0

好的。謝謝! – Mathias