2015-08-03 21 views
0

Я делаю ajax-призыв к тому, чтобы понравиться/не понравилось на видео, и я узнал, что мне нужно передать токен CSRF, когда я отправляю данные.Codeigniter csrf ajax error

Мне нужно называть его одним, когда пользователь нажимает один и один, когда пользователь не нравится. Мой вопрос, если пользователь щелкает, как и понимает, что они сделали ошибку, и нажмите на нелюбви они будут получать сообщение об ошибке:

403 Forbidden

The action you have requested is not allowed.

Если пользователь обновляет страницу первого и изменяет их выбор все это нормально. это только тогда, когда они пытаются переключиться с одного на другое без обновления.

Вот мой код:

<script> 
    // like btn 
    $('.like-btn').click(function() { 
    $('.dislike-btn').removeClass('text-danger');  
    $(this).addClass('liked-video'); 
    $.ajax({ 
     type:"POST", 
     url: '<?=base_url("videos/like_video")?>', 
     data: {video_id: <?=$video_id?>, user_id: <?=$logged_in_userid?>, value: "like", '<?=$this->security->get_csrf_token_name()?>':'<?=$this->security->get_csrf_hash()?>'}, 
     success: function() {} 
    }); 
    }); 

    // dislike btn 
    $('.dislike-btn').click(function() { 
    $('.like-btn').removeClass('text-success'); 
    $(this).addClass('disliked-video'); 
    $.ajax({ 
     type:"POST", 
     url: '<?=base_url("videos/dislike_video")?>', 
     data: {video_id: <?=$video_id?>, user_id: <?=$logged_in_userid?>, value: "dislike", '<?=$this->security->get_csrf_token_name()?>':'<?=$this->security->get_csrf_hash()?>'}, 
     success: function() {} 
    }); 
    }); 
</script> 

Почему это дает пользователю сообщение об ошибке при внесении изменений в их выборе?

+0

Я думаю, что csrf_token_name и csrf_hash больше не действительны. Возможно, вам нужно обновить токен. – Lirux

+0

Хорошая точка. Не знаю, как я обновил токен. Есть ли способ сделать это без обновления страницы? – iamthestreets

ответ

1

Поэтому я скопировал этот абзац из руководства пользователя.

«Токены могут быть либо регенерированы при каждом представлении (по умолчанию), либо сохраняются одинаково на протяжении всего срока службы CSRF-файла. Регенерация токенов по умолчанию обеспечивает более строгую безопасность, но может привести к проблемам с удобством использования, поскольку другие токены становятся недействительными (назад ./вперед навигации, несколько вкладок/окон, асинхронные действия и т.д.) Вы можете изменить это поведение, отредактировав следующий параметр конфигурации "

Попробуйте добавлять/редактировать эту строку в файл конфигурации:.

$ конфиге ['csrf_regeneration'] = TRUE;

+0

Спасибо! Я получил его на работу, но в итоге внесет несколько изменений. – iamthestreets

0

Существует еще один способ сделать это, что не требует отключения регенерации csrf. вы можете отправить новый токен csrf обратно в вызывающий сценарий ajax.

в контроллере CodeIgniter:

$data = array('data'=> 'data to send back to browser'); 
$csrf = $this->security->get_csrf_hash(); 
$this->output 
    ->set_content_type('application/json') 
    ->set_output(json_encode(array('data' => $data, 'csrf' => $csrf))); 

$ Данные = данные для возврата в браузер

$ CSRF = новый CSRF токен, который будет использоваться браузером для запроса поста следующего АЯКСА

Очевидно, вы можете выводить это другими способами, но JSON используется в основном с вызовами ajax. Кроме того, включать этот маркер в каждом почтовом ответ будет использоваться для следующего после запроса

Затем в следующем запросе Ajax (JavaScript):

var token = data.csrf; 

$.ajax({ 
    url: '/next/ajax/request/url', 
    type: 'POST', 
    data: { new_data: 'new data to send via post', csrf_token:token }, 
    cache: false, 
    success: function(data, textStatus, jqXHR) { 
     // Get new csrf token for next ajax post 
     var new_csrf_token = data.csrf  
     //Do something with data returned from post request 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // Handle errors here 
     console.log('ERRORS: ' + textStatus + ' - ' + errorThrown); 
    } 
}); 

также помнить, что там, где я получил csrf_token:token заменить crf_token с имя вашего токена, найденное в приложении/config/config.php, на котором указано $config['csrf_token_name'] = 'csrf_token';

Смежные вопросы