У меня проблемы со входом через 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();
}
});
}