2015-01-27 5 views
0

Я пытаюсь использовать REST API в своем приложении iOS. Я знаю, что это работает, потому что я могу сделать запрос на вход один раз. Каждый последующий запрос выходит из строя с ошибкой 401. Даже если я удалю приложение из симулятора, его все равно нельзя вызвать снова, пока я не изменю тип симулятора на тот, который я раньше не использовал (т. Е. IPad 2, iPhone6 ​​и т. Д.). Я также могу использовать такую ​​услугу, как https://www.hurl.it, чтобы сделать тот же запрос с теми же параметрами столько раз, сколько захочу. Я использую AFNetworking и AFHTTPRequestOperationManager. Что я делаю не так?AFNetworking to REST API возвращает 401

self.manager = [[AFHTTPRequestOperationManager alloc]initWithBaseURL:[NSURL URLWithString:@"https://api.mydomain.com/"]]; 
[self.manager POST:@"services/json/user/login" parameters:@{@"username":@"USERNAME", @"password":@"PASSWORD"} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    if (![responseObject isKindOfClass:[NSDictionary class]]) { return; } 

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    NSDictionary* json = responseObject; 
    self.sessionName = json[@"session_name"]; 
    self.sessionId = json[@"sessionid"]; 
    [defaults setObject:self.sessionName forKey:@"SessionNameKey"]; 
    [defaults setObject:self.sessionId forKey:@"SessionIDKey"]; 

    if (completion) { completion(); } 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Session request failed: %@", error.userInfo); 
}]; 

ответ

0

(Несанкционированный) 401 означает, что у вас нет доступа к службе. Убедитесь, что вы пытаетесь с правильными учетными данными. Видимо, в коде нет ничего плохого.

1

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

+0

Вы правильно. И этот токен доступа работает для всех последующих запросов, сделанных в том же сеансе. Но если я удалю приложение из симулятора и заново его запустил, код входа не удастся. – InkGolem

+0

Итак, код входа в систему только один раз в жизни? Это странно. – sarunw

+0

Какую услугу вы используете? Есть ли вероятность, что они это делают неправильно? – sarunw

1

Если API имеет базовую аутентификацию, вам необходимо передать учетные данные в HTTP-заголовке. Чтобы задать учетные данные в заголовке вы можете использовать следующие методы:

[self.manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username" password:@"password"]; 
+0

Я получаю такую ​​же ошибку, передавая параметры таким образом. Я подозреваю, что это неверно, потому что имя пользователя и пароль более точно - имя приложения и токен приложения. – InkGolem

+0

Это зависит от веб-сервисов, код ошибки 401 означает, что вы не авторизованы для доступа. Если службы обеспечены базовой аутентификацией, используя указанные методы, вы можете передавать учетные данные. – OMK

+0

Это правда, но у меня есть способ работать несколько раз. Это неспособность назвать «логин» второй раз, что меня озадачивает. – InkGolem

0

обновление для iOS9 с Swift 2.0 с использованием авторизации однонаправленного

У меня была такая же проблема, на самом деле sessionManager.session.configuration.HTTPAdditionalHeaders получить перезаписана requestSerializer на iOS9, который вызывают ошибку 401 Access denied.

код, который работал на iOS8, но не на iOS9:

sm.session.configuration.HTTPAdditionalHeaders = ["Authorization" : "Bearer \(token!)"] 

Новый код iOS9

sm.requestSerializer.setValue("Bearer \(token!)", forHTTPHeaderField: "Authorization") 
Смежные вопросы