PlayFrameworkでPOSTが403で返ってきた(CSRFの話)

前回はセッションとキャッシュ周り

今回はPOST送信時の画面遷移でCSRFフィルタに引っかかってエラーになるようだった

やったことは以下の2点

  • フォームテンプレート+CSRFフォームフィールドを追加
  • リクエストヘッダを追加

順番に。

1つ目。

フォームテンプレート+CSRFフォームフィールドを追加

これは単純で

<form action="/pick1" method="POST"> となっていたものを

@form(routes.PickController.pick()) {

に変更。直下にCSRF用のフォームフィールドを追加

結果としてこうなる

@form(routes.PickController.pick()) {
    @CSRF.formField

これだけだとエラーになってしまったので、調べてみるとリクエストヘッダが必要と。

2つ目。リクエストヘッダを追加

これは各テンプレート(htmlファイルとか)の先頭とかに書いている@()の後ろに(implicit req: RequestHeader)を追加する

これでリクエストヘッダの情報と合わせてCSRFトークンチェックとかはフレームワーク側でやってくれるのであんまり気にしないで良くなったはず。