5

Ich habe eine Weile nach "AFNetworking 2 with Digest Authentication" gesucht und keine nützlichen Diskussionen darüber gefunden (außer this one, aber leider sieht es aus wie für AFNetworking 1) .Verwendung von AFNetworking 2 mit Digest-Authentifizierung

Hier ist mein Code ohne Authentifizierung:

NSString* apiURL = @"https://api.example.com/WS.asmx"; 
AFHTTPSessionManager* manager = [AFHTTPSessionManager manager]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
[manager 
    GET:apiURL 
    parameters: [NSDictionary dictionaryWithObjectsAndKeys:@"ID", 1234 , nil] 
    success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 
    } 
    failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSLog(@"WS request failed: %@", error); 
    } 
]; 

Wo und wie kann Digest Auth-Code Kick in?

Antwort

2

Diese Frage ist ein bisschen alt, aber ich musste genau das tun und ich konnte keine eingebaute Methode finden, um damit umzugehen. Die Lösung, die ich verwendete, war AFNetworkings AFURLSessionManager.m zu bearbeiten. Im Grunde ändern Sie diese Delegate-Methode, um http Digest zu unterstützen, hier ein vollständiges Beispiel.

- (void)URLSession:(NSURLSession *)session 
        task:(NSURLSessionTask *)task 
    didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
    completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler 
    { 
     NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; 
     __block NSURLCredential *credential = nil; 

     if (self.taskDidReceiveAuthenticationChallenge) { 
      disposition = self.taskDidReceiveAuthenticationChallenge(session, task, challenge, &credential); 
     } else { 
      if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
       if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { 
        disposition = NSURLSessionAuthChallengeUseCredential; 
        credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; 
       } else { 
        disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; 
       } 
      } else if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPDigest]) { 
       NSDictionary *userkeys = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:challenge.protectionSpace]; 

       credential = [userkeys objectForKey:(NSString *)[[userkeys allKeys] objectAtIndex: 0]]; 
       if (credential) { 
        disposition = NSURLSessionAuthChallengeUseCredential; 
       } else { 
        disposition = NSURLSessionAuthChallengePerformDefaultHandling; 
       } 
      }else { 
       disposition = NSURLSessionAuthChallengePerformDefaultHandling; 
      } 
     } 

     if (completionHandler) { 
      completionHandler(disposition, credential); 
     } 
    } 

Sie müssen dem sharedCredentialStorage vor dieser Abfrage einen Berechtigungsnachweis hinzufügen. Sie können die Apple Docs dafür überprüfen, da es ziemlich einfach ist, aber stellen Sie sicher, dass der Schutzraum genau übereinstimmt, einschließlich des Bereichs. Ich hoffe es hilft jemandem.

+0

Eine wirklich gute Lösung. –

-1

ich den folgenden Code nur verwendet und hat gut funktioniert

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSURLCredential *credential = [[NSURLCredential alloc] initWithUser:@"Username" password:@"Password" persistence:NSURLCredentialPersistenceForSession]; 
[manager setCredential:credential]; 
+0

Dies funktioniert gut bis AFNetwork Version 3. –

2

ich AFNetworking-3-Upgrade vor kurzem, gibt es keine NSURLConnection Unterstützung mehr.

Wenn ich zu NSURLSession ändere, habe ich dasselbe Problem.

Vielen Dank Bob, bearbeiten AFNetworks AFURLSessionManager.m funktioniert gut für mich.

Aber danach fand ich einen einfacheren Weg, wenn self.taskDidReceiveAuthenticationChallenge gesetzt ist, müssen wir nicht AFNetworkings Code ändern.

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 

NSURLCredential *myCredential = [[NSURLCredential alloc] initWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession]; 

[manager setTaskDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLAuthenticationChallenge * _Nonnull challenge, NSURLCredential *__autoreleasing _Nullable * _Nullable credential) { 
    if (challenge.previousFailureCount == 0) { 
     *credential = myCredential; 
     return NSURLSessionAuthChallengeUseCredential; 
    } else { 
     return NSURLSessionAuthChallengePerformDefaultHandling; 
    } 
}];