OAuth 2 заголовок авторизации носителя
С обновлением API клиента метод HTTPBasicAuthication был заменен на OAuth2. Bearer
Заголовок авторизации.
Со старым API я бы сделал следующее:
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];
Но это не будет работать с Bearer
заголовок.
Теперь обычно я просто добавляю заголовок сам, добавляя его так:
NSString *authorization = [NSString stringWithFormat:@"Bearer %@",self.account.token];
[urlRequest setValue:authorization forHTTPHeaderField:@"Authorization"];
Но проблема с этими решениями заключается в том, что API перенаправляет большинство вызовов на другие URL, это связано с безопасностью. После NSURLRequest
перенаправляется, заголовок авторизации удаляется из запроса, и так как я не могу добавить метод Bearer в NSURLCredentialStorage
он не может больше аутентифицироваться после перенаправления.
Какие бы были хорошие решения? Я могу только думать, чтобы поймать перенаправление и изменить NSURLRequest
так что это включает в себя Bearer
заголовок. Но как?
3 ответа
Ну, после долгих исследований я обнаружил, что мне просто придется заменить NSURLRequest
когда звонок перенаправлен.
Не так хорошо, как хотелось бы, но работает.
я использовал AFNetworking
и добавил блок перенаправления, затем проверьте, Authorization
заголовок все еще установлен, если я не создаю новый NSMutableURLRequest
и установите все свойства в соответствии со старым запросом (я знаю, что мог создать только изменяемую копию):
[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;
}];
Я использую AFNetworking Library
Найдите AFHttpClient.m и у вас есть метод
- (void)setAuthorizationHeaderWithToken:(NSString *)token {
[self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Token token=\"%@\"", token]];
}
замените этот метод на следующий, или, если он вам нужен для обратной совместимости, оставьте его надстройкой с другим именем и используйте это имя
- (void)setAuthorizationHeaderWithToken:(NSString *)token {
[self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Bearer %@", token]];
}
затем сделайте запрос с токеном доступа oauth. (Ниже приводится метод 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) {
//
}];
обновленный
Используйте Oauth2 Client на AFNetworking, написанный Мэттом
Если у вас возникла эта проблема с каркасом отдыха Django и маршрутизаторами, проблема может быть связана с конечной косой чертой, обрезанной NSUrlRequest. если косая черта обрезана, тогда django придется перенаправить ваш запрос, чтобы избежать этого, вы можете использовать Trailing_slash = True, как это
router = routers.DefaultRouter(trailing_slash=False)
Таким образом, ни ваш заголовок авторизации, ни ваши параметры не будут потеряны.
Надеюсь, это сэкономит кому-то время.