DRF_Docker上でJWT認証を使ってcurlコマンドでユーザー情報を取得する #180日目
昨日から苦戦していたことが解決しました。
こちらの記事を参考に、ユーザー情報の取得を試みていたのですが、アプリをDocker上で起動させていることや設定の問題が重なり、苦戦しました。
JWT認証の設定については以前に記事にしました。
前提として、ユーザー情報を取得するために今回はcurlコマンドでリクエストを送信しています。
curlコマンドとは
curlコマンドとは、サーバーから、もしくはサーバーへデータ転送を行うコマンドです。HTTPのGETやPOSTはもちろん、HTTPSやFTP, Telnet, SMTP, IMAP, POP3など様々な通信プロトコルをサポートしています。
簡単なコードでAPIを叩くことができるので、作ったAPIが意図通りに動作しているか等、テストするのに最適です。
以下の書式でコマンドが実行できます。
curl [options] [URL]
特にオプションを指定しなければGETメソッドが送信されます。
明示的にリクエストメソッドを指定する場合は、-Xオプションで以下のように指定できます。
curl -X [リクエストメソッド] [URL]
# 例
curl -X GET http://127.0.0.1:8000/api/v1/auth/users/
他には、例えば-HでオプションでHTTPヘッダを追加できます。
curl -X [リクエストメソッド] [URL] -H '[パラメーター]: [値]'
# 例
curl -X GET http://127.0.0.1:8000/api/v1/auth/users/ -H 'Authorization: JWT XXXXXXXXXXXXXXXXXXXXX'
上記で例示したコマンドを使って、ユーザー情報の取得を試みます。
Step1: アクセストークンを取得する
178日目の記事にあるように、今回はDjango標準のUserモデルで、かつJWT認証を活用しています。ユーザー情報にアクセスするには認証情報が必要なので、まずはそれを取得します。
djoserでJWT認証を使っている場合、以下のパスへアクセスします(urlのパスのauthより前は自身で設定したものになります)
http://localhost:8000/api/v1/auth/jwt/create
すると以下のような画面になるので、ここで管理ユーザーのuser name とpassをPOSTします(予め管理ユーザーを作成しておく必要があります)。
ここで表示された「access」が今回使用するアクセストークンです。
何度かいろいろと操作するうちに、なぜかMIME Typeが実行できないというエラーが出て、djoserのCSSが実行されなくなりました。そのため皆さんの環境で再現する場合、上記画面はDRF標準のもっといい感じの見た目になると思います。
このエラー自体も深掘り甲斐がありそうなので、原因や対処法が分かったらまとめたいと思います。
Step2: コンテナネットワークのIPアドレスを使ってcurlコマンドを実行する
次に、ヘッダーに先ほど取得したアクセストークンを入力する形でcurlコマンドを実行します。Dockerを使用していない場合は以下のようなコマンドになります。
curl -X GET http://127.0.0.1:8000/api/v1/auth/users/ -H 'Authorization: JWT XXXXXXXXXXXXXXXXXXXXX'
ただ、Docker上で動かしている場合は以下のようなエラーが出ます。
curl: (7) Failed to connect to 127.0.0.1 port 8000: 接続を拒否されました
これはDockerのコンテナネットワークとポートマッピングの問題で、以前の記事で解説させていただいた内容に起因しています。解決策としては、IPアドレスにコンテナネットワークのIPアドレスを入力すればOKです。例えば以下のような感じです。
curl -X GET http://172.19.0.2:8000/api/v1/auth/users/ -H 'Authorization: JWT XXXXXXXXXXXXXXXXXXXXX'
Step3: settings.pyでDEBUG=Falseの設定をする
上記まででcurlコマンドでリクエストを飛ばすことはできました。ただ、Dockerを使っている場合はDEBUG=Falseの設定も必要です(単純にローカル環境でテストしているだけなら不要かと思います)。
DEBUG=TrueのままStep2のコマンドを実行すると、以下のようなエラーが出ます。
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
<div id="explanation">
<p>
You’re seeing this error because you have <code>DEBUG = True</code> in your
Django settings file. Change that to <code>False</code>, and Django will
display a standard page generated by the handler for this status code.
</p>
</div>
そのためsettings.pyを変更しておきます。
[config/settings.py]
DEBUG = False
ALLOWED_HOSTS = ['*']
これで再度コマンドを実行してみます。
curl -X GET http://172.19.0.2:8000/api/v1/auth/users/ -H 'Authorization: JWT XXXXXXXXXXXXXXXXXXXXX'
以下のように(登録しておいた)ユーザー情報が抽出されたら成功です!
[{"email":"","id":1,"username":"admin"},{"email":"","id":2,"username":"admin2"},{"email":"","id":3,"username":"user1"},{"email":"","id":4,"username":"user2"},{"email":"","id":5,"username":"user3"},{"email":"","id":6,"username":"user4"},{"email":"","id":7,"username":"user5"},{"email":"","id":8,"username":"user6"},{"email":"","id":9,"username":"user7"}]
無事にJWT認証でデータを抽出できることが確認ができました。
ここまでお読みいただきありがとうございました!!