2012-08-23 8 views
13

Mit einer Aktualisierung der API des Clients wurde die HTTPBasicAuthication-Methode durch einen OAuth2-Berechtigungsheader OAuth2 Bearer ersetzt.OAuth 2 Bearer Authorization-Header

Mit dem alten API ich folgendes tun würde:

NSURLCredential *credential = [NSURLCredential credentialWithUser:self.account.username 
                 password:self.account.token 
                 persistence:NSURLCredentialPersistenceForSession]; 

NSURLProtectionSpace *space = [[NSURLProtectionSpace alloc] initWithHost:kAPIHost 
                    port:443 
                   protocol:NSURLProtectionSpaceHTTPS 
                    realm:@"my-api" 
                authenticationMethod:NSURLAuthenticationMethodHTTPBasic]; 

Aber dieser mit dem Bearer Header wird nicht funktionieren.

Jetzt normalerweise würde ich nur hinzufügen, die ich selbst Header, indem sie es wie so hinzufügen:

NSString *authorization = [NSString stringWithFormat:@"Bearer %@",self.account.token]; 
[urlRequest setValue:authorization forHTTPHeaderField:@"Authorization"]; 

Aber das Problem mit dieser Lösung ist, dass die API die meisten der Anrufe zu anderen URLs umleiten, dies zu tun mit Sicherheit. Nachdem die NSURLRequest umgeleitet wurde, wird der Berechtigungsheader aus der Anfrage entfernt, und da ich die Bearer-Methode nicht zu der NSURLCredentialStorage hinzufügen kann, kann sie nach der Umleitung nicht mehr authentifizieren.

Was wären gute Lösungen? Ich kann nur denken, um die Umleitung zu fangen und die NSURLRequest zu modifizieren, also schließt sie die Bearer Überschrift mit ein. Aber wie?

Antwort

15

Gut nach viel Forschung fand ich heraus, dass ich nur die NSURLRequest ersetzen muss, wenn ein Anruf umgeleitet wird.

Nicht so schön, wie ich es gerne hätte, aber es funktioniert.

verwendete ich AFNetworking und hinzugefügt, um die Weiterleitung blockieren, dann überprüfen Sie, ob die Authorization Header noch gesetzt, wenn nicht ich eine neue NSMutableURLRequest und setzen alle Eigenschaften erstellen, die alte Anforderung entsprechen (Ich weiß, ich nur eine änderbare Kopie erstellt haben könnte):

[requestOperation setRedirectResponseBlock:^NSURLRequest *(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse) { 

    if ([request.allHTTPHeaderFields objectForKey:@"Authorization"] != nil) { 
     return request; 
    } 

    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:request.URL cachePolicy:request.cachePolicy timeoutInterval:request.timeoutInterval]; 
    NSString *authValue = [NSString stringWithFormat:@"Bearer %@", self.account.token]; 
    [urlRequest setValue:authValue forHTTPHeaderField:@"Authorization"]; 

    return urlRequest; 

}]; 
+1

Sie sind eine Legende. Ich stieß auf das gleiche Problem und die Behandlung der Umleitung behoben es. – rawbeans

4

I AFNetworking Bibliothek

Finden AFHttpClient.m und Sie haben eine Methode

- (void)setAuthorizationHeaderWithToken:(NSString *)token { 
    [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Token token=\"%@\"", token]]; 
} 
bin mit

ersetzen diese Methode mit der folgenden oder wenn Sie es für zurück Kompatibilität benötigen halten eine mit einem anderen Namen hinzufügen und diesen Namen

- (void)setAuthorizationHeaderWithToken:(NSString *)token { 
    [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Bearer %@", token]]; 
} 

dann die Anforderung mit OAuth-Zugriffstoken machen. (Es folgt eine GET-Methode Service)

NSURL *url = [EFServiceUrlProvider getServiceUrlForMethod:methodName]; 
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 
    [httpClient setAuthorizationHeaderWithToken:@"add your access token here"]; 

    [httpClient getPath:@"" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSString *response = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     // 
    }]; 

Aktualisiert

Verwenden OAuth2 Client auf durch matt geschrieben AFNetworking

https://github.com/AFNetworking/AFOAuth2Client

+0

Nein, wenn die Anfrage umgeleitet wird, verlieren Sie das Bearer-Token. – rckoenes

1

Wenn Sie geschehen, um dieses Problem zu haben mit Django Rest Framework und die Router das Problem könnte mit dem abschließenden Schrägstrich durch die NSUrlRequest abgeschnitten werden.wenn das hintere Schrägstrich abgeschnitten wird, dann wird django haben Ihre Anfrage umleiten, um dies zu vermeiden können Sie Trailing_slash = True wie diese

router = routers.DefaultRouter(trailing_slash=False) 

auf diese Weise nicht Ihre Autorisierungsheader noch Ihre Parameter verwenden werden verloren gehen.

Hoffe das spart jemand einige Zeit.

+1

Nein Django, aber ASP.net und ich habe es auch mit PHP gesehen. Sobald eine URL-Weiterleitung erfolgt, wird die Autorisierung gelöscht. Dies ist normales Verhalten und nachdem eine 403 empfangen wurde, wird der Aufruf erneut mit dem Header "Authorization" durchgeführt. Problem ist, dass 'Bearer'-Header nicht sehr gut unterstützt werden. – rckoenes

+0

Wow. Wir haben Django-Ruhe benutzt und sind ausgeflippt, um herauszufinden, warum IOS den Autorisierungs-Token-Header nicht gesendet hat, und das war es, NSURLRequest entfernte den abschließenden Schrägstrich – yeahdixon

Verwandte Themen