2011-11-10 19 views
5

私はjQuery MobileとPHP(CodeIgniterフレームワーク)で構築されたWebアプリケーションを持っています。今私はそれをPhoneGapのバージョンにしてスタンドアロンのアプリケーションとして配布できるようにしようとしています。しかし、PHPのWebアプリケーション。バージョンは、認証のためのCodeIgniterプラグインであるIon Authを使用します。認証が必要なページに行くと、認証コントローラのログインメソッドにリダイレクトされます。認証の後、ホームページ(この場合はjQuery Mobileページ)にリダイレクトされます。とにかく家のページが家のコントローラによって最初に開かれているので、これはウェブアプリでうまくいきます。jQuery MobileとPhoneGapの認証

しかし、ここでの要点は:PhoneGapバージョンでは、「ホーム」ページはPhoneGapのindex.htmlファイルである必要があります。明らかにPhoneGap.plistに値を追加して起動時に別のURLを読み込むことはできますが、それはAppleがApp Storeに送信するために受け入れられません。また、認証でリダイレクトを行うと、認証後にindex.htmlファイルに戻ることができません。

PhoneGap/jQuery Mobileアプリでの認証方法を教えてください。

UPDATE:

私はこの答えの一つに記載しようとしているが、アプリはまだ私はちょうどからログインしたい場合、(存在しない)アカウント/ログインページに移動しようとしますポストとメソッドから値を返す:私は削除またはがあった任意のリダイレクトをコメントアウトしていると思います

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

     } 
    } 

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

は、ここでコントローラのメソッドです。だから私はなぜそれがまだビューを読み込もうとするのか分からないのですか?私はそのURLに投稿するので、そこにナビゲートしようとしているjQuery Mobileと何か関係がありますか?

答えて

4

あなたのアプリケーションからあなたのWebサービス(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()はPOSTリクエストにログインフォームのデータを追加します:あなたのログインは次のようになります。この例では、WebサービスがJSONを返すと仮定しています。

+0

ありがとう、ありがとう。実際にはWebサービスではなく、CodeIgniterのプラグインです。私はあなたの例のようなものを持っています。唯一の問題は、アカウント/ログイン(アカウントコントローラのログインメソッド)に投稿するとログインしますが、ビューアカウント/ログインにナビゲートしようとすることにもなります。私はそれを望んでいない。値を返すだけですが(値は返されますがそれでもログインページに移動しようとしています...私の更新を見てください) – Anders

+0

私はそれを理解したので、今働いています。ありがとう。 – Anders

+4

今後これを見ている人は知っています、あなたの解決策は何ですか? – Jasper

2

PhoneGap Plugin:ChildBrowser(iPhone、Android、その他)とそのlocChangedメソッドを見ましたか?

私は、PhoneGap/AndroidにOAuth(Twitter App)とOpenID(AppLaud App)を使用しているコード化されたアプリケーションしかありませんが、子ブラウザのプラグインにはそれらに必要なものがあります。 Ion Authのような音が似ているかもしれません。プロバイダによって駆動される認証の後、ユーザをシームレスにアプリに戻してください。

+0

ありがとう、面白そうです。しかし、私は実際にPhoneGapをこのアプリケーションでコーディングしていない(XCode/Objective-Cは除く)、jQuery Mobileとhtmlしかないので、何を達成するために何をすべきかはわからない私は欲しい。 – Anders

5

フォームが依然として送信していて、ページを変更しようとしている理由は、送信ハンドラJavascriptに構文エラーがあるためです。 2行目でeventが定義されていないため、event.preventDefault()エラーが発生しました。ハンドラは失敗しますが、ブラウザはデフォルトのactionmethodを使用してフォームを送信します。

ファンクションシグネチャを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

関連する問題