この記事では、curlコマンドでセッションを維持する方法について紹介します。
次のコマンドはDjangoの管理者画面にcurlコマンドでアクセスしたものです。
認証画面でログイン情報を入力し、その後にセッション情報が必要な画面へアクセスしています。
# 認証画面へアクセス
curl -X GET -c cookie.txt http://127.0.0.1/admin/login/ | grep csrfmiddlewaretoken
# 認証画面でログイン情報を入力してsubmit
curl -i -X POST -b cookie.txt -c cookie.txt \
-d 'username=admin&password=hogehoge&csrfmiddlewaretoken=XXXXX' \
http://127.0.0.1/admin/login/
# ログイン情報を保持していないと接続できないページへアクセス
curl -X GET -b cookie.txt http://127.0.0.1/admin/auth/group/ | grep '<title>'
※ コマンドが長い部分はバックスラッシュで改行しています。
解説
コマンドオプション
まずは、使用しているコマンドオプションを紹介します。
- -X : (-request) 通信時のメソッドを指定できます。
- -i : (-include) 今回の処理で必須ではありませんが、使用するとHTTPヘッダーを出力できます。
- -c : (-cookie-jar) cookieの情報をファイルに書き込むことができます。
- -b : (-cookie ) 使用するとファイルに保存したcookieをHTTPサーバーに送信できます。
- -d : (-data) POSTリクエストで指定されたデータをHTTPに送信します。
curlマニュアル:https://docs.oracle.com/cd/E62101_01/html/E62874/curl-1.html
コマンドの内容
次はコマンドの内容について、順を追って解説します。
まずは一番最初のコマンドです。
# 認証画面へアクセス
curl -X GET -c cookie.txt http://127.0.0.1/admin/login/ | grep csrfmiddlewaretoken
Djangoのログインには画面表示時にランダムで生成されるCSRFトークンと、生成したトークンを保持するためのセッション情報が必要となります。
-c オプションを使用することで、セッション情報をcookie.txtに保存しています。
grep csrfmiddlewaretoken はコマンド実行時に出力されるHTMLテキストからCSRFトークンを取得するために記述しています。
実際にコマンドを実行すると次のように表示されます。
<form action="/admin/login/" method="post" id="login-form"><input type="hidden" name="csrfmiddlewaretoken" value="3WtyOAup85bWAQbj128j4RxXLTdHoWZulpgZfoDR0cCgVbBrrRn5u5ghA4pqbAZ8">
value=以降の文字列はCSRFトークンで、次に解説するコマンドで使用します。
また、こちらがcurlコマンドでアクセスを行なっている画面です。
次は2番目のコマンドです。先ほどは上記の画面に対してGETを行い、CSRFトークンを取得しましたが、今回はこちらの画面に対してPOSTメソッドを使用して認証情報を送信します。
# 認証画面でログイン情報を入力してsubmit
curl -i -X POST -b cookie.txt -c cookie.txt \
-d 'username=admin&password=hogehoge&csrfmiddlewaretoken=3WtyOAup85bWAQbj128j4RxXLTdHoWZulpgZfoDR0cCgVbBrrRn5u5ghA4pqbAZ8' \
http://127.0.0.1/admin/login/
-b オプションに先ほど-cオプションで作成したcookie.txtを使用することで、セッション情報を引き継ぐことがきます。
そして再び-c オプションを使用することで認証成功時の情報をcookie.txtに保存します。
-d でサーバーに送信するログイン情報を設定します。
ここでは、username、password、csrfmiddlewaretokenをそれぞれ設定しています。
このパラメータは上記画像の"name"に設定されている名前を使用します。
username には admin。
password には hogehoge。
csrfmiddlewaretoken には 最初のコマンドで出力されたvalue=以降の文字列を設定します。
コマンドが成功すると次のような結果が出力されます。
HTTP/1.1 302 Found
## 中略 ##
Set-Cookie: csrftoken=1osVZSWmwyIfTwA8q0pNvCgcH1ARnBj7jtEGBxYL2EPBs3XUd5Z63tf8M2KHAfYS; expires=Sat, 09 Jul 2022 07:03:05 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Set-Cookie: sessionid=o0gkwbcctp4ijjdkbh7i1l7j5n2ab7mz; expires=Sat, 24 Jul 2021 07:03:05 GMT; HttpOnly; Max-Age=1209600; Path=/; SameSite=Lax
最後にログイン済みの状態でのみアクセスできる画面に対してcurlコマンドを実行します。
アクセスする実際の画面がこちらです。
そのままコマンドを実行するとページ内の情報が全て表示されてしまうため、
タブに表示されている "Select group to change" が titleタグに記載されているかを確認します。
curl -X GET -b cookie.txt http://127.0.0.1/admin/auth/group/ | grep '<title>'
| (パイプ) で curl コマンドの実行結果を受け取り、grep で'<title>'
タグが含まれる行を検索しています。
こちらを実行すると次のようになります。
<title>Select group to change | Django site admin</title>
これで、curlコマンドでセッションを保持しつつ通信を行えることが確認できました。
検証環境の配布
今回使用した環境はDocker-Composeで作成しています。
実際に検証を行なっていみたい方は、ソースコードをGitにアップロードしているのでご利用ください。
git: https://github.com/ruruyuki/django_container_rest
コンテナの使い方
前提
・DockerとDocker Composeがインストール済みであること。
・コマンドラインで作業すること。
作業手順
・上記URL(Git)からダウンロードしたソースを解凍する。
・解凍したディレクトリに「--master 1」などの記述があれば削除し、
名前がdjango_container_restとなるようにする。
・django_container_restディレクトリに、コマンドラインで移動する。
・移動したディレクトリ内で以下コマンドを実行する。
docker-compose up -d --build
・Webブラウザで「http://127.0.0.1:80/admin」にアクセスする。
すると、Djangoの管理画面にアクセスできます。
ユーザー名は「admin」。
パスワードは「hogehoge」でログインすることができます。
関連記事
・ curlコマンドでPOSTする (JSON版)
・ curlコマンドでPOSTする (画面送信版)
・【Python】requestsのsessionとcookiesでPOST通信を検証