Я разрабатываю приложение, которое будет взаимодействовать с веб-сервером (PHP с задней частью MySQL), используя веб-представления. У меня есть приложение, работающее со статическими URL как тесты, но теперь мне нужно настроить для реального взаимодействия с пользователем.
Я искал решения для проверки подлинности HTTP, но считаю, что фраза неверна, поскольку большинство результатов поиска, которые я получаю, связаны с запросами «REST». Я буду использовать URL (PHP / MySQL) для проверки подлинности и не считаю, что это соответствует критериям REST на основе моего опыта.
У меня пока нет SSL на этом сервере, поэтому я не уверен, какие опции доступны через Cocoa.
Вопросы, которые у меня есть:
Есть ли способ создать представление, которое загружается, если идентификатор учетной записи еще не хранится локально?
Если да, могу ли я закодировать приложение, чтобы заменить файл раскадровки, который я создал, если требуется проверка подлинности?
Если шаги 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 не будет анализировать его).