2015-05-10 4 views
1

У меня проблемы с компонентом защиты CSRF в Phalcon с Ajax.Использование службы защиты CSRF с Ajax в Phalcon

HTML форма

<form id="signup-form" onSubmit="onSignUpSubmit(); return false;"> 
    <input id="username" type="text" placeholder="Username" /> 
    <input id="password" type="password" placeholder="Password" /> 
    <input id="email" type="text" placeholder="Email" /> 
    <input id="signup-csrf-token" name="{{ security.getTokenKey() }}" val="{{ security.getToken() }}" type="hidden" /> 
    <button class="btn btn-primary btn-block" type="submit">Sign Up</button> 
</form> <!-- #signup-form --> 

Ajax код

var username = $('#username', '#signup-form').val(), 
    password = $('#password', '#signup-form').val(), 
    email  = $('#email', '#signup-form').val(), 
    csrfKey  = $('#signup-csrf-token').attr('name'), 
    csrfValue = $('#signup-csrf-token').attr('val'); 

    var postData = { 
     'username': username, 
     'password': password, 
     'email': email 
    }; 
    postData[csrfKey] = csrfValue; 

    $.ajax({ 
     type: 'POST', 
     url: '{{ url('/accounts/signup.action') }}', 
     data: postData, 
     dataType: 'JSON', 
     success: function(result){ 
      console.log(result); 
     } 
    }); 

При отправке запроса Ajax в первый раз, $this->security->checkToken() функции контроллера возвращает истину. Но во второй раз и позже функция возвращает false.

Я думаю, что csrfToken изменений для каждого HTTP-запроса вызвали эту проблему. Но как его решить?

Может ли кто-нибудь мне помочь?

ответ

1

Вам нужно будет вернуть новый токен CSRF в ответ на AJAX. Затем обновите поле формы новым токеном.

счета/signup.action

return json_encode((object) array(
    'output' => $original_output, 
    'csrf' => (object) array('name' => $csrf_name, 'value' => $csrf_token) 
)); 

Javascript

$.ajax({ 
    type: 'POST', 
    url: '{{ url('/accounts/signup.action') }}', 
    data: postData, 
    dataType: 'JSON', 
    success: function(result){ 
     $('input#signup-csrf-token') 
      .attr('name', result.csrf.name) 
      .val(result.csrf.value); 
     console.log(result.output); 
    } 
}); 

Вы должны также изменить

$('#signup-csrf-token').attr('val'); 

до

$('#signup-csrf-token').val(); 
+0

Да, это решение! Позвольте мне посмотреть, как это сделать в Phalcon. –

+0

Вы сказали, что это работает, что пошло не так? – fyrye

+0

Извините, но сейчас работает. –