Вход через AJAX в CodeIgniter - PullRequest
       8

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

0 голосов
/ 05 ноября 2018

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

Я разочарован, пытаясь в течение 3+ часов повторить все и попытаться отладить его шаг за шагом.

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

Функция My Back-end контроллера:

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 ) )

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

/**
 * 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-> правильно установлено на TRUE. Впоследствии значение $ dump_jar_on_match равно TRUE, так как я передаю буквально это значение. Тем не менее, он отказывается идти в предложении IF, когда я проверяю возврат, он ничего не возвращает. Вся функция продолжает возвращать 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.log($form.serialize());
                    //console.log('submitted successfully!');
                    //console.log(data);

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

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