【发布时间】:2019-02-12 22:01:22
【问题描述】:
我正在学习使用 Phoenix 框架,并且正在尝试向控制器操作执行 AJAX 发布 - 但是,我遇到了 CSRF 保护问题。
对于初学者,我没有使用表单 - 只是想将文本从输入传递到控制器:
<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
我几乎从一个运行良好的 Rails 应用程序中解除了 $.ajax 调用,但它在这里没有起到作用 - 运行它会返回 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。
任何人都可以提供任何指导吗?谢谢!
【问题讨论】:
-
你的 html 中有 CSRF 元标记吗?
-
感谢@Gazler - 我还可以通过按照您的建议添加元标记来解决此问题。我之前测试时遗漏的事情是 Phoenix 期望参数为
_csrf_token,您甚至可以在我上面的问题中看到。只是错过了那个小细节......好吧,生活和学习!
标签: ajax phoenix-framework elixir