前段
現在自分は Rails 中心で開発を行っているが、ローカルで API 検証を行う際に、ログイン認証が必要な API に対して CSRF Token を指定せずに API 実行を行うと下記のエラーが発生する。
Can't verify CSRF token authenticity.
これは CSRF 対策のために必要なブロックなのだが、検証時は結構煩わしい……。
検証スキップ
そこで、まず一時的に CSRF Token の検証をスキップさせる方法がある。
class ApplicationController < ActionController::Base
+ skip_before_action :verify_authenticity_token
end
Cookie・CSRF Token の取得・設定
が、上記のように都度一時コードを差し挟んで検証をスキップさせるやり方は面倒だったので……簡単なシェルスクリプトを作った。
-
get-csrf-token.sh(サンプルコード)
#! /bin/bash
BASE_URL="http://localhost:3000"
COOKIE_VALUE=$1
COOKIE="hoge_cookie=${COOKIE_VALUE}"
echo "COOKIE: $COOKIE"
# CSRF Token 取得用 API を実行
curl -s -b "$COOKIE" \
-H "Accept: application/json" \
"$BASE_URL/fuga_csrf"
- 実行
- 引数:ログイン後、「Chrome Dev Tool / アプリケーション / Cookie」から値を取得し、引数として指定する
sh get-csrf-token.sh # Cookie の値を指定
- 出力例
COOKIE: hoge_cookie=54321
{"csrf_token":"12345-abcde-hoge"}
- 上記出力された値を、環境変数に設定
COOKIE= # 出力された Cookie を指定
CSRF_TOKEN= # 出力された CSRF トークンの値を指定
- curl で API 実行
(サンプル)
curl -s -b "$COOKIE" \
-H "X-CSRF-Token: $CSRF_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-X POST "http://localhost:3000/foo/bar" \
-d '{
"hoge": {
"fuga": 123
}
}' \
| jq .
その他、方法:GUI ツールの活用
例えば Postman などの API 実行用の GUI ツールを使う場合。
予め UI 上に表示されている「Cookies」の項でドメイン(今回の例だと「localhost:3000」)を設定しておく。
以下サンプルのように CSRF Token 取得用の API を設定しておき、ログイン後、API 実行。

すると、必要な Cookie 情報を自動で設定してくれる。
こちらの方が便利だと感じる。
[追記] なお Cookie を手動で設定する場合は、ログイン後 Developer Tool のアプリケーション/Cookie で取得した値を、Headers に Key: Cookie, Value: _your_applicaiton_name_session=hoge の形式で保存してリクエストすると良い。なお CSRF Token 取得 API でも同様に Cookie 指定が必要(同一 Token に認証済み Session を紐付けるため)。
CSRF Token 取得 API レスポンスとして受け取った値を X-CSRF-Token Header に指定して下記サンプルのように API 実行するという方法がある。
直感的・かつ、少し手間が少ないので、こちらの方がやりやすいかもしれない。
なおログインの度に毎回 Header に指定する X-CSRF-Token の値を書き換えるのが面倒であれば、下記のような方法などもある模様。
- Postman の Pre-request Script 機能を活用する(参考:https://zenn.dev/nayushi/articles/760ea06a3a9585 )
以上、開発効率化のための Tips(備忘)。
