2011-11-10 3 views
5

У меня есть веб-приложение, созданное с помощью jQuery Mobile и PHP (Framework CodeIgniter). Теперь я также пытаюсь сделать версию PhoneGap, чтобы сделать ее доступной как автономное приложение. Тем не менее, веб-приложение PHP. версия использует Ion Auth, плагин CodeIgniter для аутентификации. Поэтому, когда вы переходите на страницу, требующую аутентификации, приложение перенаправляет вас к методу входа в контроллер проверки подлинности. И после аутентификации он перенаправляет вас обратно на домашнюю страницу (в этом случае на странице jQuery Mobile). Это прекрасно работает в веб-приложении. Так как домашняя страница в любом случае открыта домашним контроллером.Аутентификация в jQuery Mobile и PhoneGap

Но вот суть: в версии PhoneGap домашняя страница должна быть файлом index.html в PhoneGap. Очевидно, вы можете загрузить другой URL-адрес при запуске, добавив значение в PhoneGap.plist, но это неприемлемо для Apple для отправки в магазин приложений. И если я сделаю переадресацию в аутентификации, я не могу вернуться к файлу index.html после аутентификации ...

Итак, как следует обходить аутентификацию в мобильном приложении PhoneGap/jQuery?

UPDATE:

Я попытался это в соответствии с одним из ответов, но приложение все еще пытается перейти на страницу аккаунта/авторизации (который не существует), когда я просто хочу, чтобы войти в систему через отправлять и возвращает значение из метода:

$('#login_form').bind('submit', function() { 
     event.preventDefault(); 
     //send a post request to your web-service 
     $.post('http://localhost/app_xcode/account/login', $(this).serialize(), function (response) { 
      //parse the response string into an object 
      var response = response; 
      //check if the authorization was successful or not 
      if (response == true) { 
       $.mobile.changePage('#toc', "slide"); 
      } else { 
       alert('login failed'); 
       $.mobile.changePage('#toc', "slide"); 
      } 
     }); 
    }); 

Вот метод контроллера:

function login() 
    { 
     //validate form input 
     $this->form_validation->set_rules('identity', 'Identity', 'required'); 
     $this->form_validation->set_rules('password', 'Password', 'required'); 

     $base_url = $this->config->item('base_url'); 

     $mobile = $this->detect_mobile(); 
     if ($mobile === false && $base_url != 'http://localhost/app_xcode/') //Only restrict if not developing 
      redirect('account/notAMobile'); 

     else if ($this->form_validation->run() == true) { //check to see if the user is logging in 
      //check for "remember me" 
      $remember = (bool)$this->input->post('remember'); 

      if ($this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember)) { //if the login is successful 
       //redirect them back to the home page 
       $this->session->set_flashdata('message', $this->ion_auth->messages()); 

       echo true; 
       /*redirect($this->config->item('base_url'), 'refresh');*/ 
      } 
      else 
      { //if the login was un-successful 
       //redirect them back to the login page 
       $this->session->set_flashdata('message', $this->ion_auth->errors()); 
       /*redirect('account/login', 'refresh');*/ //use redirects instead of loading views for compatibility with MY_Controller libraries 
      } 
     } 
     else 
     { //the user is not logging in so display the login page 
      //set the flash data error message if there is one 
      $this->data['message'] = (validation_errors()) ? validation_errors() 
        : $this->session->flashdata('message'); 

      $this->data['identity'] = array('name' => 'identity', 
              'id' => 'identity', 
              'type' => 'text', 
              'value' => $this->form_validation->set_value('identity'), 
      ); 
      $this->data['password'] = array('name' => 'password', 
              'id' => 'password', 
              'type' => 'password', 
      ); 

     } 
    } 

Я думаю, что я удалил или комментировал любые редиректы, которые были там. Поэтому я не знаю, почему он пытается загрузить представление еще? Имеет ли он какое-то отношение к jQuery Mobile, пытающееся перейти туда, потому что я отправляю на этот URL-адрес?

ответ

4

Вы можете запросить ваш веб-сервис (Ion Auth) из своего приложения. с jQuery. Ваш Логин будет выглядеть примерно так:

//add event handler to the `submit` event for your login form 
$('#login_form').bind('submit', function() { 

    //send a post request to your web-service 
    $.post('http://my-domain.com/my-auth/auth.php', $(this).serialize(), function (response) { 

     //parse the response string into an object 
     response = $.parseJSON(response); 

     //check if the authorization was successful or not 
     if (response.status === 'success') { 
      //do login here 
     } else { 
      //do error here 
     } 
    }); 
}); 

$(this).serialize() добавит данные регистрационную форму по желанию поста. В этом примере предполагается, что ваш веб-сервис вернет JSON.

+0

Хорошо, спасибо. На самом деле это не веб-сервис, а просто плагин для CodeIgniter. Тем не менее, у меня есть что-то вроде вашего примера.Единственная проблема заключается в том, что когда я отправляю аккаунт/логин (метод входа в контроллер учетной записи), он входит в систему, но также пытается перейти к учетной записи/логину просмотра. Я не хочу этого. Я просто хочу вернуть значение (я повторяю его в методе входа), но даже при возврате значения он все равно пытается перейти на страницу входа ... См. Мое обновление. – Anders

+0

Я понял, так что теперь он работает. Благодарю. – Anders

+4

Итак, люди, которые видят это в будущем, знают, каково было ваше решение? – Jasper

2

Вы посмотрели плагин PhoneGap: ChildBrowser (iPhone, Android, другие) и его метод locChanged?

У меня есть только кодированные приложения, которые используют OAuth (Twitter App) и OpenID (AppLaud App) для PhoneGap/Android, но для плагина для дочернего браузера есть то, что необходимо для них. Похоже, что Ion Auth может быть аналогичным: после авторизации с помощью auth, верните пользователя в приложение без проблем.

+0

Спасибо, выглядит интересно. Не уверен, как использовать его для этого, хотя ... Я практически не использовал фактическое кодирование PhoneGap в этом приложении (не говоря уже о XCode/Objective-C), только jQuery Mobile и html, поэтому я не уверен, что делать, чтобы добиться чего Мне нужно. – Anders

5

Причина, по которой ваша форма все еще отправляется, и она пытается сменить страницы, состоит в том, что у вас есть синтаксическая ошибка в вашем обработчике отправки Javascript. В строке 2, event не определен, поэтому пытается вызвать event.preventDefault() ошибок. Хотя обработчик не работает, браузер по-прежнему отправляет форму, используя ее по умолчанию action и method.

Либо замените свою сигнатуру функции на function(event) {, либо просто верните false из функции. Возврат false эквивалентен предупреждению по умолчанию.

$('#login_form').bind('submit', function() { 

    //send a post request to your web-service 
    $.post('http://localhost/app_xcode/account/login', $(this).serialize(), function (response) { 
     //check if the authorization was successful or not 
     if (response == true) { 
      $.mobile.changePage('#toc', "slide"); 
     } else { 
      alert('login failed'); 
      $.mobile.changePage('#toc', "slide"); 
     } 
    }, 'JSON'); 

    return false; 
}); 
+0

Правильно, я на самом деле понял это сам и получил его работу. Но спасибо! – Anders

+0

Следите за этим: 'response == true'. Вы проверяете правдивые/ложные значения из сценария на стороне сервера, который потенциально может отправить что-то, чего вы не ожидаете (например, страница с ошибкой, а не ожидаемый результат). Я просто рекомендую использовать '===', чтобы убедиться, что вы точно получите то, что ожидаете. – Jasper

Смежные вопросы