Pytanie AFNetworking 2.0 i HTTP Basic Authentication


Nie można znaleźć AFHTTPClient na AFNetworking 2.0, aby użyć:

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com]];

[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

Jak to zarządzać w AFNetworking 2.0?


44
2017-09-30 19:37


pochodzenie




Odpowiedzi:


AFNetworking 2.0 nowa architektura używa serializerów do tworzenia żądań i analizowania odpowiedzi. Aby ustawić nagłówek autoryzacji, należy najpierw zainicjować menedżer operacji żądania, który zastąpi AFHTTPClient, utworzyć serializer, a następnie wywołać dedykowaną metodę ustawiania nagłówka.

Na przykład kod stanie się:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://examplewebsite.com"]];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"userName" password:@"password"];

Powinieneś przeczytać dokumentacja i przewodnik migracji zrozumieć nowe koncepcje dołączone do wersji 2.0 programu AFNetworking.


95
2017-10-01 08:48



Zobacz także credential własność na AFHTTPRequestOperationManager - David Snabel-Caunt
Dzięki David, pierwsza metoda nie działa dla mnie. - Legoless
Potrafi potwierdzić, że właściwość poświadczeń nie wydaje się działać. Ignoruje wszystko, co zostało przypisane. - Michael
Wystąpił ten problem podczas migracji z iOS7 do iOS8. Z jakiegoś powodu w iOS8 musiałem jawnie ustawić nagłówek autoryzacji, gdzie na iOS7 pozostawiam poświadczenia w samym adresie URL ("użytkownik: pw@example.com ") działało dobrze. - FishStix
Ważne jest, aby pamiętać: setAuthorizationHeaderFieldWithUsername:password: zakoduje za pomocą Base64. Jeśli twój serwer odszyfrowuje za pomocą innego procesu deszyfrowania, to nie zadziała, O ile nie skonfigurujesz deszyfrowania serwera przy użyciu Base64. - Brandon A


Oto przykład wykonywania podstawowego uwierzytelniania HTTP za pomocą AFNetworking 2.0 przy użyciu NSURLCredential. Zaletą tego podejścia jest użycie AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password: Metoda polega na tym, że można automatycznie zapisać nazwę użytkownika i hasło w pęku kluczy, zmieniając znak persistence: parametr NSURLCredential. (Widzieć ta odpowiedź.)

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

NSURLCredential *credential = [NSURLCredential credentialWithUser:@"user" password:@"passwd" persistence:NSURLCredentialPersistenceNone];

NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"GET" URLString:@"https://httpbin.org/basic-auth/user/passwd" parameters:nil];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCredential:credential];
[operation setResponseSerializer:[AFJSONResponseSerializer alloc]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Failure: %@", error);
}];
[manager.operationQueue addOperation:operation];

15
2018-01-05 22:18



bardzo przydatny, dzięki. - EmilDo
To działało dla mnie w przypadku niektórych wniosków. Jednak żądania wieloczęściowe nie powiodły się z powodu błędu "odrzucono treść żądania żądania". Nie jestem pewien bez dalszego badania, ale myślę, że twoje rozwiązanie wykonuje jedną prośbę, czeka na odpowiedź 401, a następnie ponawia żądanie z podanymi danymi uwierzytelniającymi. Żądania wieloczęściowe zawodzą, ponieważ nie można odtworzyć strumienia. Zobacz podobny problem w AFNetworking 1.x github.com/AFNetworking/AFNetworking/issues/661 - gimenete
W wersjach 2.4.1 i AF wersji 2.4.1 to nie działa dla mnie. Nie wysyła nagłówka autoryzacji w ogóle .. - Brynjar


Jak @gimenete wspomina, że ​​żądania wieloczęściowe zawiodą podczas korzystania z poświadczeń @titaniumdecoy, ponieważ jest to stosowane w bloku wyzwania, a obecna wersja AFNetworking ma z tym problem. Zamiast używać podejścia uwierzytelniającego, możesz osadzić uwierzytelnianie w nagłówku NSMutableRequest

    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"PUT"  URLString:path parameters:myParams constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
                    [formData appendPartWithFileData:imageData name:imageName fileName:imageName mimeType:@"image/jpeg"];
            } error:&error];    
    NSString *authStr = [NSString stringWithFormat:@"%@:%@", [self username], [self password]];
    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedString]];
    [request setValue:authValue forHTTPHeaderField:@"Authorization"];

Gdzie trzeba użyć zewnętrznej biblioteki kodującej BASE64, takiej jak NSData + Base64.h i .m Plik z Matt Gallaghers przygotował rozwiązanie ARC BASE64


6
2017-07-12 13:01



+1 za wspomnienie o problemie AFNetworking z wyzwaniem auth. - user623396