このブログははてなブログからの移行記事です。
LaravelにおけるCSRFトークン
Laravel5.1(おそらく以前のバージョンも)ではデフォルトでCSRFトークンによる認証ミドルウェアが有効になっています。
なのでフォームを書くときは以下のようなBladeファイルを書く必要がある。
<form method="POST">
<input type="text">
<input type="submit">
{{ csrf_token() }}
</form>
こうするとtype="hidden"でCSRFトークンを生成し埋め込んでくれる。
しかしAjax通信をしようと思うとちとめんどくさい。ぱっと思いつくのは以下の2つの方法。
前者は規模が大きくなればなるほど管理がめんどくさいし、後者は場合によっちゃありだがセキュリティ的によろしくない。
じゃどうすればいいのよ!
結論
いつだって答えはドキュメントにあります。
jQueryでAjaxを行う場合に限る解決策ですが、ライブラリが変わっても本質は同じかと。
要するに全ページの<meta>タグでcsrf_token()を埋め込み、ajax通信のデフォルトヘッダにそこを読みこませるように設定しなよ!ってこと。
こうすることで一度設定してあげればトークンを意識することなくセキュアなAjax通信ができる。
(以下、ドキュメントより丸々抜粋)
<meta name="csrf-token" content="{{ csrf_token() }}">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
僕の場合はAjax通信を1クラスに集約しているのでそこで4行書くだけで後は何もせずともオッケーな感じになっている。
まとめ
ドキュメント読もうぜ!!!