Вход через AJAX в CodeIgniter

У меня возникают проблемы со входом в систему через AJAX в моем решении CodeIgniter. Решение представляет собой уже существующую базу кода и использует библиотеку аутентификации сообщества для аутентификации. Я хочу, чтобы пользователь вошел в систему через AJAX, и в случае успеха он должен войти в систему и немедленно перенаправить на предыдущую страницу, в случае неудачи просто показать сообщение об ошибке.

Я разочарован после трех с лишним часов попыток повторить все и попытаться отладить это шаг за шагом.

Это код, который у меня есть.

Моя функция внутреннего контроллера:

public function logInWithAjax() {


        if ( $this->input->is_ajax_request() )
        {
            // Allow this page to be an accepted login page
            $this->config->set_item('allowed_pages_for_login', ['backend/backend/logInWithAjax'] );

            // Make sure we aren't redirecting after a successful login
            $this->authentication->redirect_after_login = FALSE;

            // Do the login attempt
            $this->auth_data = $this->authentication->user_status( 0 );

            // Set user variables if successful login
            if ( $this->auth_data )
                $this->_set_user_variables();

            // Call the post auth hook
            $this->post_auth_hook();

            // Login attempt was successful
            if ( $this->auth_data )
            {
                echo json_encode([
                    'status'   => 1,
                    'user_id'  => $this->auth_user_id,
                    'username' => $this->auth_username,
                    'level'    => $this->auth_level,
                    'role'     => $this->auth_role,
                    'email'    => $this->auth_email
                ]);
            }

            // Login attempt not successful
            else
            {
                $this->tokens->name = 'login_token';

                $on_hold = (
                    $this->authentication->on_hold === TRUE OR
                    $this->authentication->current_hold_status()
                )
                    ? 1 : 0;

                echo json_encode([
                    'status'  => 0,
                    'count'   => $this->authentication->login_errors_count,
                    'on_hold' => $on_hold,
                    'token'   => $this->tokens->token()
                ]);
            }
        }

        // Show 404 if not AJAX
        else
        {
            show_404();
        }
    }

Проблема в функции logInWithAjax, она отлично передает все в методе user_status до следующей строки кода:

// Verify that the form token and flash session token are the same
            if ( $this->CI->tokens->token_check( 'token', TRUE ) )

Результат этой функции ВСЕГДА является ложным независимо от чего-либо. Функция представляет собой обычный библиотечный код, я вставлю его ниже.

/**
 * Check the token status with a provided token name, or "token" by default
 */
public function token_check( $rename = '', $dump_jar_on_match = FALSE )
{
    // If rename provided, check that token name
    $this->name = ( $rename == '' ) ? config_item('token_name') : $rename;

    // If no token jar contents, no reason to proceed
    if ( ! empty( $this->jar ) )
    {
        // Set the posted_value variable
        if ( $this->posted_value = $this->CI->input->post( $this->name ) )
        {
            // If the posted value matches one in the jar
            if ( in_array( $this->posted_value, $this->jar ) )
            {
                // Successful token match !
                $this->match = TRUE;

                // Dump all tokens ?
                if ( $dump_jar_on_match )
                {
                    $this->jar = [];

                    $this->save_tokens_cookie();
                }

                // Just delete the matching token
                else
                {
                    // What token jar key was the matching token ?
                    $matching_key = array_search( $this->posted_value, $this->jar );

                    // Remove the matching token from the jar
                    unset( $this->jar[ $matching_key ] );

                    // Auto generate a new token
                    $this->generate_form_token();
                }

                if ( $this->debug )
                {
                    log_message( 'debug', count( $this->jar ) . '@token_check' );
                    log_message( 'debug', json_encode( $this->jar ) );
                }

                return TRUE;
            }
        }
    }

    return FALSE;
}

Я заметил, что совпадение $ this-> правильно установлено на ИСТИНА. После этого значение $ dump_jar_on_match будет ИСТИНА, поскольку я передаю это значение буквально. Однако он отказывается войти в предложение IF, когда я помещаю туда return для тестирования, он ничего не возвращает. Вся функция продолжает возвращать false.

Моя страница входа - это простая форма, открывающаяся с помощью form_open, поэтому скрытое поле «токен» заполняется.

<div class = "card-content">
<div class = "card-body">
    <?php
    echo form_open('', array('class' => 'form-horizontal loginform', 'id' => 'loginform', 'novalidate' => 'novalidate'));
    ?>
    <!--<form id = "loginform" class = "form-horizontal loginform" action = "#" novalidate = "novalidate">-->
        <fieldset class = "form-group position-relative has-icon-left">
            <input type = "text" class = "form-control input-lg" id = "user-name" name = "login_string" placeholder = "Gebruikersnaam of e-mail"
                   tabindex = "1" required data-validation-required-message = "Gelieve je gebruikersnaam of e-mail in te vullen aub.">
            <div class = "form-control-position">
                <i class = "ft-user"></i>
            </div>
            <div class = "help-block font-small-3"></div>
        </fieldset>
        <fieldset class = "form-group position-relative has-icon-left">
            <input type = "password" class = "form-control input-lg" id = "password" name = "login_pass" placeholder = "Wachtwoord"
                   tabindex = "2" required data-validation-required-message = "Gelieve je wachtwoord in te vullen aub.">
            <div class = "form-control-position">
                <i class = "la la-key"></i>
            </div>
            <div class = "help-block font-small-3"></div>
        </fieldset>
        <div class = "form-group row">
            <!--<div class = "col-md-6 col-12 text-center text-md-left">
                <fieldset>
                    <input type = "checkbox" id = "remember-me" class = "chk-remember">
                    <label for = "remember-me"> Remember Me</label>
                </fieldset>
            </div>-->
            <div class = "col-md-12 col-12 text-center text-md-right"><a href = "recover-password.html" class = "card-link">Wachtwoord vergeten?</a></div>
        </div>
        <button type = "submit" class = "btn btn-danger btn-block btn-lg login-button"><i class = "ft-unlock"></i> Log in</button>
        <div class = "hidden loader-wrapper login-ajax-loader">
            <div class = "loader-container">
                <div class = "ball-pulse-sync loader-green">
                    <div></div>
                    <div></div>
                    <div></div>
                </div>
            </div>
        </div>
    </form>
</div>

На данный момент у меня есть следующий код JavaScript:

var getUrl = window.location;
var baseUrl = getUrl .protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];

/*** START Log In Page JS ***/
//Login Register Validation
if ($("form.loginform").attr("novalidate")!=undefined){
    $("input,select,textarea").not("[type=submit]").jqBootstrapValidation({
        submitSuccess: function ($form, event) {
            $('.login-button').addClass("hidden");
            $('.login-ajax-loader').removeClass("hidden");
            $.ajax({
                type: 'POST',
                url: baseUrl + '/backend/backend/logInWithAjax',
                data: $form.serialize(),
                success: function(data)
                {
                    //TODO: de ajax moet checken of de log in kan. Zoja -> redirect naar gewoon log in systeem (met redirect URL mee te geven)
                    //Zonee -> toon de error class stuff
                    if (!data.result) {
                        $('.login-page-alert').removeClass("hidden");
                    } else {
                        $('.login-page-alert').addClass("hidden");
                    }

                    //console.info($form.serialize());
                    //console.info('submitted successfully!');
                    //console.info(data);

                    $('.login-button').removeClass("hidden");
                    $('.login-ajax-loader').addClass("hidden");
                }
            });

            // will not trigger the default submission in favor of the ajax function
            event.preventDefault();
        }
    });
}

вы получаете перенаправление в своем запросе ajax? , каково значение baseUrl в вашей функции javascript? он такой же, как в твоем конфиге? вы также можете использовать здесь ваш config baseurl как baseUrl ='<?=base_url()?>'

user969068 05.11.2018 01:07

Привет @DFriend, банка не пуста / Я вернул их значения: {"result": {"posted_value": "c0702485", "jar": ["e69a97eb", "2748‌ a0c6", "b01dc1a4", "d7‌ D07cf5 "," c44a59c2 "," ‌ 02de1f71 "," 46e09544 "‌," 5217cc8b "," c070248‌ 5 "," 92bec8dd "]}}

Dennis 05.11.2018 08:30

Я автор Community Auth. Я могу сказать вам, что библиотека Tokens - это не ваша проблема, и если это так, потому что у вас неправильно настроена конфигурация файлов cookie / сессий или, возможно, проблема с вашим PHP. Попробуйте включить ведение журнала CodeIgniter на уровень 2, затем попробуйте войти в систему и понаблюдать за строками отладки, которые Community Auth добавляет в журнал. Еще одна вещь, которую следует учитывать, заключается в том, что в подавляющем большинстве случаев, когда у людей возникают проблемы с Community Auth, процесс установки не понимался или выполнялся неправильно. Не похоже, что здесь дело обстоит именно так. По возможности покажите опубликованные данные!

Brian Gottier 06.11.2018 09:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
125
0

Другие вопросы по теме