2011-11-10 11 views
5

Mam aplikację internetową zbudowaną z jQuery Mobile i PHP (framework CodeIgniter). Teraz staram się również zrobić jego wersję PhoneGap, aby mogła być dystrybuowana jako samodzielna aplikacja. Jednak aplikacja internetowa PHP. Wersja wykorzystuje Ion Auth, plugin CodeIgniter do uwierzytelniania. Kiedy przejdziesz do strony wymagającej uwierzytelnienia, aplikacja przekieruje Cię do metody logowania kontrolera uwierzytelniania. A po uwierzytelnieniu przekierowuje z powrotem na stronę główną (w tym przypadku strona jQuery Mobile). Działa to dobrze w aplikacji internetowej., Ponieważ strona główna jest otwierana przez kontroler domowy w pierwszej kolejności.Uwierzytelnianie w jQuery Mobile i PhoneGap

Ale tu jest sedno: w wersji PhoneGap stroną "domową" musi być plik index.html w PhoneGap. Prawdopodobnie możesz załadować inny adres URL przy starcie, dodając wartość w PhoneGap.plist, ale to nie jest akceptowalne przez Apple do przesłania do sklepu z aplikacjami. A jeśli zrobię przekierowanie w uwierzytelnianiu, nie mogę wrócić do pliku index.html po uwierzytelnieniu ...

Jak zatem należy postępować w sprawie uwierzytelniania w aplikacji PhoneGap/jQuery Mobile?

UPDATE:

Próbowałem to według jednej z odpowiedzi, ale aplikacja wciąż próbuje przejść do konta/strony logowania (który nie istnieje), po prostu chcę, aby zalogować się poprzez zakładać i zwrócić wartość z metody:

$('#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"); 
      } 
     }); 
    }); 

Oto metoda kontroler:

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', 
      ); 

     } 
    } 

myślę, że zostały usunięte lub wykomentowane żadnych przekierowań, które były tam. Więc nie wiem, dlaczego próbuje załadować widok nadal? Czy ma to jakiś związek z aplikacją jQuery Mobile próbującą nawigować, ponieważ publikuję ten adres URL?

Odpowiedz

4

Możesz wysyłać żądania do swojej usługi internetowej (Ion Auth) z aplikacji. z jQuery. Twój login będzie wyglądać mniej więcej tak:

//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() doda dane formularza logowania do wniosku post. Ten przykład zakłada, że ​​twoja usługa sieciowa zwróci JSON.

+0

OK, dziękuję. To naprawdę nie jest serwis internetowy, to tylko wtyczka do CodeIgniter. Mam jednak coś w rodzaju twojego przykładu.Jedyny problem polega na tym, że kiedy wysyłam do konta/logowania (metoda logowania w kontrolerze konta), loguje się, ale w końcu próbuje przejść do konta widoku/logowania. Nie chcę tego. Po prostu chcę zwrócić wartość (echo jeden w metodzie logowania), ale mimo zwracanej wartości nadal próbuje przejść do strony logowania ... Zobacz moją aktualizację. – Anders

+0

Rozgryzłem to, więc teraz działa. Dzięki. – Anders

+4

Więc ludzie, którzy zobaczą to w przyszłości, wiedzą, jakie było twoje rozwiązanie? – Jasper

2

Czy obejrzałeś wtyczkę PhoneGap: ChildBrowser (iPhone, Android, inne) i jej metodę locChanged?

mam zakodowane tylko aplikacje, które używają protokołu OAuth (Twitter App) oraz OpenID (AppLaud App) dla PhoneGap/Android, ale dziecko ma wtyczki do przeglądarki, co jest potrzebne dla tych. Wygląda na to, że Ion Auth może być podobny: po autoryzacji przez dostawcę, możesz bezproblemowo odesłać użytkownika do aplikacji.

+0

Dzięki, wygląda interesująco. Nie wiem, jak tego użyć w tym przypadku ... Nie zrobiłem prawie żadnego rzeczywistego kodowania PhoneGap w tej aplikacji (nie mówiąc już o XCode/Objective-C), tylko jQuery Mobile i html, więc nie jestem pewien, co zrobić, aby osiągnąć to, co Potrzebuję. – Anders

5

Powód, dla którego formularz wciąż się przesyła i próbuje zmienić strony, jest spowodowany błędem składni w kodzie JavaScript procedury przesyłania. W linii drugiej, event nie jest zdefiniowany, więc próbuje wywołać błędy event.preventDefault(). Chociaż procedura obsługi kończy się niepowodzeniem, przeglądarka nadal przesyła formularz, korzystając z jego domyślnych wartości: action i method.

Zmień nazwę funkcji na function(event) { lub po prostu zwróć false z funkcji. Zwracanie false jest równoznaczne z zapobieganiem domyślnym.

$('#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

Słusznie, sam to wymyśliłem i zadziałało. Ale dzięki! – Anders

+0

Uważaj na to: 'odpowiedź == prawda'. Sprawdzasz wartości true/falsy ze skryptu po stronie serwera, który może wysłać coś, czego nie oczekujesz (np. Strona błędu zamiast oczekiwanego wyniku). Po prostu polecam użycie '===', aby upewnić się, że otrzymujesz dokładnie to, czego oczekujesz. – Jasper

Powiązane problemy