XCode, аутентификация и NSUserDefaults

Я разрабатываю приложение, которое будет взаимодействовать с веб-сервером (PHP с задней частью MySQL), используя веб-представления. У меня есть приложение, работающее со статическими URL как тесты, но теперь мне нужно настроить для реального взаимодействия с пользователем.

Я искал решения для проверки подлинности HTTP, но считаю, что фраза неверна, поскольку большинство результатов поиска, которые я получаю, связаны с запросами «REST». Я буду использовать URL (PHP / MySQL) для проверки подлинности и не считаю, что это соответствует критериям REST на основе моего опыта.

У меня пока нет SSL на этом сервере, поэтому я не уверен, какие опции доступны через Cocoa.

Вопросы, которые у меня есть:

  1. Есть ли способ создать представление, которое загружается, если идентификатор учетной записи еще не хранится локально?

  2. Если да, могу ли я закодировать приложение, чтобы заменить файл раскадровки, который я создал, если требуется проверка подлинности?

  3. Если шаги 1 и 2 работают, как я могу взаимодействовать с моим веб-сервером для аутентификации? (предпочтительный метод заключается в отправке электронной почты пользователя и MD5 пароля, поскольку это то, что в настоящее время хранится в базе данных)

В идеале я хотел бы просто отправить URL-адрес, например «login.php?login=me@blah.com&password= (md5hash)» и предоставить предоставленный ответ либо «auth = true & accountID = 5», либо «auth = false» .. затем используйте приложение iPhone, чтобы либо сообщить пользователю ошибку авторизации, либо сохранить идентификатор учетной записи в NSUserDefaults для будущего использования (чтобы обойти авторизацию позже) и загрузить обычную раскадровку уже на месте.

Любые рекомендации будут оценены.

Благодаря,

Серебряный тигр

Вы очень близки к своему мышлению. Я использую очень похожий подход к процессу входа в систему.

Я в настоящее время солью и хэш-адресом электронной почты и паролем в 1 40 символов. Если логин возвращается успешно, я сохраняю токен в NSUserDefaults. Я использую этот токен для всех других веб-запросов, идущих вперед, до тех пор, пока пользователь не выйдет из системы, и в это время я удаляю пользовательские значения по умолчанию.

Вот несколько фрагментов, которые я использую для одного процесса:

// see if a login already exists NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; self.token = [defaults stringForKey:@"token"]; // if the token is nil/blank, launch login view if(self.token == nil || [self.token isEqualToString:@""]) { [self loadStartView]; return; } // build the request to update status [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever]; NSString *stringData = [NSString stringWithFormat:@"<your api string here"]; NSString *requestData = stringData; NSData *myRequestData = [NSData dataWithBytes: [requestData UTF8String] length: [requestData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[NSString stringWithFormat:@"<your url request here>"]]]; [request setHTTPMethod: @"POST"]; [request setHTTPBody: myRequestData]; NSData *jsonData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; NSString *json = [[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] autorelease]; NSDictionary *payloadData = [json JSONValue]; [request release]; if([[payloadData objectForKey:@"success"] boolValue]) { // this is designed around my api, but you get the idea //NSLog(@"updateStatus: %@", payloadData); // updates the api version for every call [defaults setObject:self.token forKey:@"token"]; } 

Мне не хватало места для комментариев в заметках. Вот последний код. Хотя не то, что я хотел, он выполнил свою работу:

Чтобы заставить JSONValue работать, мне пришлось скачать и включить в свой проект json frameowrk, как показано здесь:

https://github.com/stig/json-framework

Когда я получил это, я получил неполную ошибку от функции JSONValue. мой первоначальный запрос URL-адреса на мой запрос PHP-страницы предоставлял ответ JSON следующим образом:

{"success": "0", "AccountID:" 4 "," error ":" "}

По какой-то причине функция JSONValue не понравилась этому выводу, и мне пришлось изменить ее на более базовую менее предпочтительную версию следующим образом:

[ "0", "4", ""]

Как только у меня была эта работа, окончательная копия кода выглядит следующим образом:

В моем основном представлении о загрузке приложения я добавил следующее, чтобы определить, существует ли существующий идентификатор учетной записи и запустить представление «Вход», если его нет:

 - (void)viewDidLoad { NSString *accountID = [[NSUserDefaults standardUserDefaults] stringForKey:@"AccountID"]; if (![accountID length]) { UIViewController *login = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"]; [self presentModalViewController:login animated:YES]; } [super viewDidLoad]; } 

Логин – это не более чем 2 текстовых поля и кнопка для аутентификации. Это функция, которую я добавил к кнопке, и она работает в настоящее время:

 -(IBAction)authenticate:(id)sender{ // This will be the validation code // First we'll grab the field values NSString *currentEmail = emailField.text; NSString *currentPassword = passField.text; // Now we will grab the user default settings (saved preferences) NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // build the request to update status NSString *myURL = [NSString stringWithFormat:@"http://www.myurl.com/auth.php?e=%@&p=%@",currentEmail,currentPassword]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:myURL]]; [request setHTTPMethod:@"GET"]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *responseString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding]; NSArray *responseArray = [responseString JSONValue]; NSString *success = [responseArray objectAtIndex:0]; NSString *AccountID = [responseArray objectAtIndex:1]; NSString *error = [responseArray objectAtIndex:2]; if([success boolValue]) { NSLog(@"User is Authenticated"); UIAlertView *auth1 = [[UIAlertView alloc] initWithTitle:@"T-of-U" message:@"Successfully Authenticated" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil]; [auth1 show]; [defaults setObject:AccountID forKey:@"AccountID"]; [self dismissModalViewControllerAnimated:YES]; } else { NSString *authMessage = error; UIAlertView *auth2 = [[UIAlertView alloc] initWithTitle:@"Authentication Failed:" message:authMessage delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil]; [auth2 show]; } } 

Я бы предпочел пару ключевых значений NSDictionary, но каждый раз, когда я отправлял ответ json с парами значений ключа, JSONValue терпела неудачу, поэтому я закончил тем, что просто сделал это простой ответ json и ссылочные объекты в местах массива, чтобы получить мои переменные.

если есть способ получить пары ключевых значений в словаре, что было бы здорово, хотя я не могу правильно сформировать свой json-ответ (PHP имеет метод json_encode ($ data), который создает json, как ожидалось, но функция Objective C не будет анализировать его).