With an update to the client's API the HTTPBasicAuthication method has been replace with a OAuth2 Bearer
Authorization header.
With the old API I would do the following:
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];
But this will not work with the Bearer
header.
Now normally I would just add the header my self by adding it like so:
NSString *authorization = [NSString stringWithFormat:@"Bearer %@",self.account.token];
[urlRequest setValue:authorization forHTTPHeaderField:@"Authorization"];
But the problem with this solutions is that the API redirect most of the calls to other URLs, this has to do with security.
After the NSURLRequest
gets redirected the Authorization header is removed from the request and since I'm unable to add the Bearer method to the NSURLCredentialStorage
it can't authenticate any more after being redirected.
What would be a good solutions? I can only think to catch the redirect and modify the NSURLRequest
so it does include the Bearer
header. But how?
Well after much research I found out that I will just have to replace the
NSURLRequest
when a call is redirected.Not as nice as I would like it to be, but is does work.
I used
AFNetworking
and added the redirect block, then check wether theAuthorization
header is still set if not I create a newNSMutableURLRequest
and set all the properties to match the old request (I know I could have just created a mutable copy):I'm using AFNetworking Library
Find AFHttpClient.m and you have a method
replace this method with the following or if you need it for back compatibility keep it an add with a different name and use that name
then make the request with oauth access token. (Following is a GET method service)
Updated
Use Oauth2 Client on AFNetworking written by matt
https://github.com/AFNetworking/AFOAuth2Client
If you happen to be having this issue with Django rest framework and the routers the problem might be related to the trailing slash being clipped by the NSUrlRequest. if the trailing slash is clipped then django will have to redirect your request, to avoid this you can use Trailing_slash = True like this
That way not your authorization header nor your parameters will get lost.
Hope this saves somebody some time.