У меня возникают проблемы со входом в систему через 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();
}
});
}
Привет @DFriend, банка не пуста / Я вернул их значения: {"result": {"posted_value": "c0702485", "jar": ["e69a97eb", "2748 a0c6", "b01dc1a4", "d7 D07cf5 "," c44a59c2 "," 02de1f71 "," 46e09544 "," 5217cc8b "," c070248 5 "," 92bec8dd "]}}
Я автор Community Auth. Я могу сказать вам, что библиотека Tokens - это не ваша проблема, и если это так, потому что у вас неправильно настроена конфигурация файлов cookie / сессий или, возможно, проблема с вашим PHP. Попробуйте включить ведение журнала CodeIgniter на уровень 2, затем попробуйте войти в систему и понаблюдать за строками отладки, которые Community Auth добавляет в журнал. Еще одна вещь, которую следует учитывать, заключается в том, что в подавляющем большинстве случаев, когда у людей возникают проблемы с Community Auth, процесс установки не понимался или выполнялся неправильно. Не похоже, что здесь дело обстоит именно так. По возможности покажите опубликованные данные!






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