Аутентификация в jQuery Mobile и PhoneGap - PullRequest
5 голосов
/ 10 ноября 2011

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

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

Так как же следует проводить аутентификацию в приложении PhoneGap / jQuery Mobile?

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, потому что я публикую эту ссылку?

Ответы [ 3 ]

5 голосов
/ 14 ноября 2011

Причина, по которой ваша форма все еще отправляется и пытается изменить страницы, заключается в том, что у вас есть синтаксическая ошибка в обработчике отправки Javascript.Во второй строке 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;
});
4 голосов
/ 10 ноября 2011

Вы можете отправлять запросы на свой веб-сервис (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.

2 голосов
/ 12 ноября 2011

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

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

...