2012-08-23 10 views
13

Con un aggiornamento all'API del client, il metodo HTTPBasicAuthoration è stato sostituito con un'intestazione Autorizzazione OAuth2 Bearer.OAuth 2 portante Intestazione autorizzazione

Con la vecchia API vorrei fare le seguenti operazioni:

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

Ma questo non funzionerà con l'intestazione Bearer.

Ora normalmente vorrei solo aggiungere l'intestazione mia auto aggiungendo in questo modo:

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

Ma il problema con questa soluzione è che l'API reindirizzare la maggior parte delle chiamate ad altri URL, questo ha a che fare con sicurezza. Dopo il reindirizzamento dello NSURLRequest, l'intestazione di autorizzazione viene rimossa dalla richiesta e poiché non riesco ad aggiungere il metodo del portatore allo NSURLCredentialStorage, non può più autenticarsi dopo essere stato reindirizzato.

Quali sarebbero le buone soluzioni? Posso solo pensare di prendere il reindirizzamento e modificare lo NSURLRequest in modo che includa l'intestazione Bearer. Ma come?

risposta

15

Dopo molte ricerche ho scoperto che dovrò semplicemente sostituire lo NSURLRequest quando una chiamata viene reindirizzata.

Non è bello come vorrei, ma funziona.

Ho usato AFNetworking e ha aggiunto il blocco di reindirizzamento, quindi controllare castrato l'intestazione Authorization è ancora impostato se non creo un nuovo NSMutableURLRequest e impostare tutte le proprietà in modo che corrisponda il vecchio richiesta (lo so che avrei potuto appena creato una copia mutabile):

[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

sei una leggenda. Ho riscontrato lo stesso problema e la gestione del reindirizzamento l'ha risolto. – rawbeans

4

sto usando AFNetworking Biblioteca

Trova AFHttpClient.m e si dispone di un metodo

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

sostituire questo metodo con il seguente o se ne avete bisogno per la compatibilità indietro tenerlo un componente aggiuntivo con un nome diverso e utilizzare quel nome

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

quindi effettuare la richiesta con accesso OAuth token. (In seguito è un servizio metodo GET)

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) { 
     // 
    }]; 

Aggiornato


Usa OAuth2 Client su AFNetworking scritto da Matt

https://github.com/AFNetworking/AFOAuth2Client

+0

No, non quando la richiesta viene reindirizzata, quindi perderai il token al portatore. – rckoenes

1

Se vi capita di essere avere questo problema con Django resto framework e router il problema potrebbe essere correlato alla barra finale che viene troncata da NSUrlRequest.se la barra finale è ritagliato poi Django dovrà reindirizzare la vostra richiesta, per evitare questo è possibile utilizzare Trailing_slash = True come questo

router = routers.DefaultRouter(trailing_slash=False) 

In questo modo non è l'intestazione di autorizzazione né i vostri parametri andranno persi.

Spero che questo salvi qualcuno un po 'di tempo.

+1

No Django, ma ASP.net e anche io l'ho visto con PHP. Non appena si verifica un reindirizzamento dell'URL, l'autorizzazione viene cancellata. Questo è un comportamento normale e dopo aver ricevuto un 403, la chiamata deve essere eseguita di nuovo con l'intestazione 'Authorization'. Il problema è che l'intestazione 'bearer' non è supportata molto bene. – rckoenes

+0

Wow. Abbiamo usato il resto di Django e stavamo cercando di capire perché IOS non stava inviando l'intestazione del token di autorizzazione, e questo era, NSURLRequest stava rimuovendo la barra finale – yeahdixon

Problemi correlati