Заголовок авторизации NSURLConnection не работает

Я пытаюсь отправить токен доступа OAuth в заголовке HTTP через NSURLConnection, но, похоже, он не отправляет заголовок, потому что API продолжает выдавать мне ошибку, говорящую, что «должен предоставить токен авторизации».

Это код, который я использую:

NSURL *aUrl = [NSURL URLWithString: @"http://generericfakeapi.com/user/profile"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:30.0];

[request addValue:[NSString stringWithFormat:@"OAuth %@", token] forHTTPHeaderField:@"Authorization"];

[request setHTTPMethod:@"GET"];

NSError *error = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error: &error];

NSDictionary *JSONDictionary = [NSJSONSerialization JSONObjectWithData:returnData options:kNilOptions error:&error];
NSLog(@"Response : %@", JSONDictionary);

А это пример команды cURL для API:

curl 'http://generericfakeapi.com/user/profile' -H 'Authorization: OAuth YourAuthToken'

Разве это не то, что я, по сути, делаю через NSURLConnection?

Любая помощь будет оценена по достоинству.


person harryisaac    schedule 19.09.2013    source источник


Ответы (4)


Измените эту строку:

NSURL *aUrl = [NSURL URLWithString: @"http://generericfakeapi.com/user/profile"];

To:

NSURL *aUrl = [NSURL URLWithString: @"http://generericfakeapi.com/user/profile/"];

По-видимому, iOS удаляет заголовок авторизации, если в конце URL-адреса нет косой черты. Эта проблема буквально стоила мне двух суток сна.

person isair    schedule 15.04.2014
comment
+1 за простейшее возможное решение. Та же проблема застряла у меня, к счастью, мне не пришлось терять сон. Однако я попытался найти дополнительную информацию, и, к сожалению, ни у кого нет четкого объяснения. Было бы очень полезно знать, почему (и до каких пор :)) - person Subhash Dike; 23.07.2014
comment
Большое спасибо, я только что столкнулся с той же проблемой. кажется, что iOS обрабатывает URL-адрес, заканчивающийся косой чертой, и URL-адрес, не заканчивающийся косой чертой, в двух разных условиях. - person Chauyan; 31.05.2017
comment
Вы спасли мой день, я потратил на это 4 критических часа, а затем, если нашел ваш ответ - person Iqbal Khan; 07.11.2018
comment
Спасибо, даже не знаю, сколько часов потрачено впустую на попытки разных вещей! - person kos; 20.08.2019
comment
-_- Я потратил 4 часа на отладку проблемы. - person Saqib Omer; 19.10.2020

Для меня это выглядит нормально. Вы уверены, что дали действительный токен? Попробуйте поймать такую ​​ошибку

if (error) {
    NSLog(@"error : %@", error.description);
}

Мой код работает хорошо:

NSURL *jsonURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://....ID=%i", cellID]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:jsonURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:120.0];
[request setValue:@"Basic ...." forHTTPHeaderField:@"Authorization"];
NSURLResponse *response;
NSError * error  = nil;
NSData *POSTReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Надеюсь, поможет

person Marko Zadravec    schedule 19.09.2013

Ответ @isair действительно спасает жизнь.

Просто добавьте основную причину, если вам интересно:

NSURLRequest определяет набор зарезервированных HTTP-заголовков. И что удивительно, Authrorization является его частью.

Система загрузки URL-адресов обрабатывает различные аспекты протокола HTTP (постоянные соединения HTTP 1.1, прокси-серверы, аутентификация и т. д.). В рамках этой поддержки система загрузки URL-адресов берет на себя ответственность за определенные заголовки HTTP:

  • Длина содержимого

  • Авторизация

  • Связь

  • Хозяин

  • Прокси-аутентификация

  • Прокси-авторизация

  • WWW-аутентификация

Если вы установите значение для одного из этих зарезервированных заголовков, система может проигнорировать установленное вами значение, перезаписать его собственным значением или просто не отправить его. Более того, точное поведение может меняться со временем. Чтобы избежать таких запутанных проблем, не устанавливайте эти заголовки напрямую.

В случае @isair весьма вероятно, что URL-адреса без косой черты в конце вызвали такое поведение фильтрации. Возможно, это несоответствие в реализации, но у нас нет доступа к исходному коду, чтобы это проверить.

В моем случае я писал веб-приложение React, которое использует заголовок Authorization для аутентификации на внутреннем сервере Django. Приложение отлично работало в настольном Chrome, но всегда не могло получить доступ к login-required API на iPhone (как в Safari, так и в Chrome) из-за отсутствия заголовка Authorization.

Идеальное решение — вообще избегать использования Authorization. Но если вы общаетесь с серверной структурой, которая специально этого требует (например, аутентификация токена Django Rest Framework). Ответ @isair может быть хорошим обходным путем.

person senyuuri    schedule 04.12.2019

У меня была такая же проблема. В моем случае я изменил «http» на «https», и все работает нормально.

person Marriage    schedule 16.05.2019