StatamicはLaravelというフレームワークを採用しており、このcsrf_token
エラーはこのLaravelに起因するエラーでした。
症状とエラーログ
症状:フォームのSubmitボタンクリック時にログイン画面が表示されてしまう。
## エラーログ /local/storage/logs/
production.ERROR: exception 'Illuminate\Session\TokenMismatchException' in /html/statamic/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:53
解決方法(新:4/10追記)
本家のサポートに問い合わせたところ「管理画面で設定できるよ」とのこと。確認するとありました。。
【ログイン>Setting>System】画面の一番下に「CSRF Excluded URLs」とあります。ここに除外するURLを登録すればOK。今回の例ではotoiawase/*
としました。前回(下の)作業で変更したlaravelのコアファイルは元に戻して、動作確認完了。いい勉強になりました。
解決方法(旧:これ以降は過去の情報です)
参考:StackOverflow:Laravel 5 でのPOSTでのルーティングがうまくいかない
参考先には「もうすぐリリースされる、ver 5.1 ではapp/Http/Middleware/VerifyCsrfToken.php
内で、$except
を設定することで、特定のルートのみcsrf_tokenのチェックをOFFにするのが出来るようになります。」とあったので、該当のファイル/html/statamic/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
を確認。$except
を設定するブロックが確認できたので、次のように該当するURIを指定。
例)/otoiawase/
のみcsrf_tokenのチェックを無効にする
# VerifyCsrfToken.php L:25
protected $except = [
'otoiawase/*',
];
補足
CSRFはセキュリティ対策の一つ。IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第4章 セッション対策:リクエスト強要(CSRF)対策
Laravel5では全てのPOSTにCSRFチェックが付いてくるとのこと。便利ではありますが、CSRFトークンが設定されていない場合はエラーになってしまいます。全てのPOSTにおいてCSRFチェックをオフにする方法もありますが、URIを絞れる場合は該当のURIのみを対象にチェックを無効にした方が良いでしょう。
注意
Statamic本体のバージョンアップを適用することにより、この設定が上書きされる(消される)可能性が高いので、バージョンアップの都度確認が必要。この辺り、なんとかならんかな。