Я научился использовать феникс-фреймворк, и я пытаюсь сделать пост AJAX для действия контроллера, однако я столкнулся с проблемой защиты CSRF.Phoenix - invald CSRF на пост AJAX
Для начала, я не использую форму - просто хочу, чтобы передать текст от входа к контроллеру:
<input type="text" id="raw-input" />
<button id="send-button">Send it!</button>
<script>
$("#send-button").click(function(){
var input = $("#raw-input").val();
$.ajax({
url: "/test/process",
type: "POST",
dataType: "json",
beforeSend: function(xhr) {xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"))},
data: {"input" : input},
success: function(response){
console.log(response);
}
});
});
</script>
Контроллер (не беспокоюсь делать что-нибудь еще input
... просто хочу проверить успешную почту):
def process(conn, %{"input" => input}) do
IO.puts "got it!"
end
и маршрутизатор:
post "/test/process", TestController, :process
Я довольно сильно поднял вызов $.ajax
из приложения Rails, где он работал нормально, но это не делает трюк здесь - запуск этого возвращает ошибку 403 и журналы (Plug.CSRFProtection.InvalidCSRFTokenError) invalid CSRF (Cross Site Request Forgery) token, make sure all requests include a valid '_csrf_token' param or 'x-csrf-token' header
.
Может ли кто-нибудь предложить какие-либо указания? Спасибо!
У вас есть метатег CSRF в вашем html? – Gazler
Спасибо @Gazler - Я также смог разрешить это, добавив метатег, как вы предлагаете. То, чего мне не хватало при тестировании ранее, было то, что Phoenix ожидает параметр как '_csrf_token', который вы даже можете увидеть в моем вопросе выше. Просто пропустил эту мелочь ... хорошо, живи и учись! – skwidbreth