2012-08-23 17 views
13

Con una actualización de la API del cliente, el método HTTPBasicAuthication se ha reemplazado por un encabezado de autorización OAuth2 Bearer.OAuth 2 bearer Encabezado de autorización

Con la antigua API que haría lo siguiente:

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

Pero esto no va a trabajar con el encabezado Bearer.

Ahora, normalmente yo sólo añadiría el encabezado de mi auto añadiendo que de este modo:

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

Pero el problema con esta solución es que la API redirigir la mayoría de las llamadas a otras URL, esto tiene que ver con seguridad Después de redireccionar el NSURLRequest, el encabezado de Autorización se elimina de la solicitud y, como no puedo agregar el método del Portador al NSURLCredentialStorage, ya no se puede autenticar después de haber sido redirigido.

¿Cuáles serían las buenas soluciones? Solo puedo pensar en atrapar la redirección y modificar NSURLRequest, por lo que incluye el encabezado Bearer. ¿Pero cómo?

Respuesta

15

Bien después de mucha investigación descubrí que tendré que reemplazar el NSURLRequest cuando se redirige una llamada.

No es tan lindo como me gustaría, pero funciona.

que utilizan AFNetworking y añade el bloque de redirección, entonces comprobado si la cabecera Authorization todavía se establece si no se crea una nueva NSMutableURLRequest y establecer todas las propiedades para que coincida con la solicitud de edad (sé que podría haber acaba de crear una copia mutable):

[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

usted es una leyenda. Me encontré con el mismo problema y el manejo del redireccionamiento lo solucionó. – rawbeans

4

estoy usando Biblioteca AFNetworking

Encuentra AFHttpClient.m y usted tiene un método

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

reemplazar este método con la siguiente o, si lo necesita para la compatibilidad hacia atrás mantenerla un complemento con un nombre diferente y utilizar ese nombre

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

luego hacer la solicitud con el token de acceso OAuth. (Lo que sigue es un servicio método 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) { 
     // 
    }]; 

Actualizado


Uso OAuth2 cliente en AFNetworking escrito por Matt

https://github.com/AFNetworking/AFOAuth2Client

+0

No, no cuando la solicitud se redirige, entonces perderá el token de portador. – rckoenes

1

Si le sucede a estar teniendo este problema con Django rest framework y los enrutadores, el problema podría estar relacionado con la barra final recortada por NSUrlRequest.si se recorta la barra final Django tendrá que reorientar su solicitud, para evitar esto se puede utilizar Trailing_slash = True como esto

router = routers.DefaultRouter(trailing_slash=False) 

De esa manera, no el encabezado de autorización ni sus parámetros se pierda.

Espero que esto ahorre a alguien en algún momento.

+1

No Django, pero ASP.net y también lo he visto con PHP. Tan pronto como se produce una redirección de URL, se borra la 'Autorización'. Este es un comportamiento normal y después de que se reciba un 403, la llamada se realizará de nuevo con el encabezado 'Authorization'. El problema es que el encabezado 'bearer' no se admite muy bien. – rckoenes

+0

Wow. Hemos estado usando Django rest and volviendo loco tratando de entender por qué IOS no estaba enviando el encabezado de token de autorización, y esto fue todo, NSURLRequest estaba eliminando la barra final – yeahdixon

Cuestiones relacionadas