概要
Django REST frameworkでAPIを開発している際に、POSTのAPIなのでコマンドラインからcurlでデバッグしようとしたところ、掲題の件でハマったのでメモ。
以下の認証を突破する必要がある。
- ユーザー認証
- CSRF認証
前提
django-debug-toolbarがインストール済みであること。
手順
1.CSRFトークンとセッションIDの値を確認する。
・任意の画面にブラウザでアクセスして、django-debug-toolbarを開く。
・Cookieのsessionid
とcsrftoken
の値を確認する。
※ sessionid
とcsrftoken
の値はリクエスト単位で変化するものではないので、一回控えておけばよい。
ポイント
CSRFトークンの値をCookieのcsrftoken
とリクエストヘッダーのX-CSRFToken
の両方に指定する必要があるようである。
※ あくまで検証結果で、内部のロジックを確認した訳ではない。
どちらかしか指定しない場合、認証に失敗する。
・Cookieのみ指定した場合
$ curl -X POST -b "sessionid=5p83l969kh2it7mkq67idg9a2rxlrvo9; csrftoken=0ICxnT6mBJjJojbwGswu54KE2Z1krheGfOhtwFb7T1ev1KMjK3IXhDL7j6GCTLrZ" -d "data=dummy" "http://localhost:8000/api/example" {"detail":"CSRF Failed: CSRF token missing or incorrect."} $
・X-CSRFTokenのみ指定した場合
$ curl -X POST -b "sessionid=5p83l969kh2it7mkq67idg9a2rxlrvo9" -H "X-CSRFToken:0ICxnT6mBJjJojbwGswu54KE2Z1krheGfOhtwFb7T1ev1KMjK3IXhDL7j6GCTLrZ" -d "data=dummy" "http://localhost:8000/api/example" {"detail":"CSRF Failed: CSRF cookie not set."} $