見出し画像

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認証でデータを抽出できることが確認ができました。

ここまでお読みいただきありがとうございました!!


参考


いいなと思ったら応援しよう!