「Django REST framework JWT」でAPI認証を行う

ノウハウ
スポンサーリンク

DjangoでAPI認証したいなぁと思い調べてみたら、「Django REST framework JWT」でトークン認証を使えば実装できそうということが分かりました。
いろいろ調べた結果、実装できたので、備忘録として残しておこうと思います。

環境は以下です。

  • ConoHa VPS (メモリ 1GB/CPU 2Core/SSD 100GB)
  • Ubuntu 18.04.4 LTS
  • Python: 3.7.6
  • Django: 2.2.2
  • Django REST Framework: 3.10.0
  • Django REST framework JWT: 1.11.0

 

目次

 


 

「Django REST framework JWT」とは?

「Django REST framework JWT」は、「Django REST Framework」というDjangoでRESTfulなAPIバックエンドを実装することができるフレームワーク上で、JWTを提供するパッケージです。
本家ページ:https://jpadilla.github.io/django-rest-framework-jwt/

 

JWTとは「JSON Web Token」の略で、RFC 7519で規定されたJSONをベースとしたアクセストークン認証のことのようです。
下の図のイメージのように、事前にユーザ認証して発行されたトークンをAPI実行時に付与することで、ユーザ認証を省略してAPI実行することが可能となります。このトークンをJSONベースで行おうというのがJWTということみたいです。

 

事前準備

上の図で示した通り、トークン発行前に事前にユーザ認証を行う必要があるので、以下の事前準備が必要です。

  • Djangoプロジェクトを作成すること
  • 認証用にデータベースとユーザを作成しておくこと

 

Djangoプロジェクトを作成すること

以下のコマンドでDjangoプロジェクトを作成したことを想定します。

$ django-admin startproject mysite

ディレクトリ構成は以下です。

mysite
|-- manage.py
`-- mysite
    |-- __init__.py
    |-- asgi.py
    |-- settings.py
    |-- urls.py
    |-- views.py (あとで作成する)
    `-- wsgi.py

 

認証用にデータベースとユーザを作成する

以下のコマンドでDjangoでデータベースとユーザを設定することができます。

// Django上でデータベースを生成
$ ./manage.py migrate

// スーパーユーザを作成
$ ./manage.py createsuperuser
  • Djangoフレームワークはデフォルトでログイン用DBが用意されているので、初期状態であったとしても./manage.py migrateを実行すれば、ログイン用DBが作成されます。
  • ./manage.py createsuperuserで作成したユーザ名、パスワードは忘れずメモしておいてください。

 

「Django REST framework JWT」を実装する

「Django REST framework JWT」を実装するため、パッケージのインストールとDjango側の設定内容についてまとめました。

 

「Django REST framework JWT」インストールする

「Django REST framework JWT」をインストールするうえで、「Django REST framework」も必要なので、合わせてインストールします。

$ pip install djangorestframework
$ pip install djangorestframework-jwt

 

Djangoの設定

Django上に「Django REST framework JWT」を実装するために、「mysite/settings.py」と「mysite/urls.py」に以下のような設定を追加します。

 

【mysite/settings.py】

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),  
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),  
    'NON_FIELD_ERRORS_KEY': 'detail',
    'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}

【mysite/urls.py】

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('get-jwt-token', obtain_jwt_token),
]

 

設定はこれで終了です。サーバを立ち上げてください。

 

[確認] トークンを取得してみる!

以下のコマンドでトークンが取得できるか確認できます。

$ curl -k https://[ドメイン名]/get-jwt-token -d "username=[ユーザ名]&password=[パスワード]"
  • runserverコマンドで立ち上げた場合は、https://[ドメイン名]http://localhostにしてください。サーバ上の構築している場合は、ご自分のドメイン名を指定してください。
  • [ユーザ名][パスワード]はDjangoアプリケーションのログイン可能なものを入れてください。事前準備で./manage.py createsuperuserコマンドを実行したのなら、そのときに設定したものです。

 

認証成功すればトークンが、失敗すれば「 Unable to log in with provided credentials. 」と返ってくるはずです。

# 結果(認証成功)
{"token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

# 結果(認証失敗)
{"detail":["Unable to log in with provided credentials."]}

 

トークン認証を実装した簡易APIを作成してみる

トークン認証を実装した簡易APIとして、Hello Worldを返すAPIを作成したいと思います。

 

Djangoの設定

API用のviewを「mysite/views.py」で新規作成し、そのパスを「mysite/urls.py」に追加します。

 

【mysite/views.py】(デフォルト状態ではないため、新規作成します)

from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status

class HelloWorldAPI(GenericAPIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        return Response(data={"greeting": "Hello World"}, status=status.HTTP_200_OK)

 

【mysite/urls.py】

from . import views

urlpatterns = [
    path('hello', views.HelloWorldAPI.as_view()),
]

 

[確認] トークン認証で簡易APIを実行してみる!

以下のコマンドでトークン認証によって簡易APIが実行できるか確認します。

$ curl -k https://[ドメイン名]/hello -H "Authorization: JWT [トークン]"
  • runserverコマンドで立ち上げた場合は、https://[ドメイン名]http://localhostにしてください。サーバ上の構築している場合は、ご自分のドメイン名を指定してください。
  • "Authorization: JWT [トークン]"Authorization:JWT[トークン]の間には半角スペースが入るので注意です。

 

認証成功すれば、簡易APIが実装されて、Hello Worldが返ってくるはずです。

# 認証成功
{"greeting": "Hello World"}

# 認証失敗
{"detail":"Authentication credentials were not provided."}

 

参考

 

関連情報

ConoHa上でDockerを導入したり、DjangoでWebアプリを立ち上げたりした内容を以下の記事でまとめました。こちらもよろしければご覧になってください。

 

 

広告

 

Djangoをやるなら以下の書籍がオススメです。
DjangoでWebアプリを開発するときの要点が分かりやすくまとめられています。

 


 

ConoHa VPS は初期費用不要で月に数百円で利用できる仮想サーバのサービスです。
以下のような方には非常にオススメのサービスとなっています!

  • 勉強がてらLinuxの環境をちょっと触ってみたい
    管理者権限が実行可能なLinuxサーバ環境が構築可能です!
  • スモールスタートでサービスを提供して、うまくいったら規模をスケールアップしたい
    後からメモリサイズやCPU数などのスケールアップ/スケールダウン可能です!
  • AWSやGCPなどのクラウドサービスは高いので、もっと安くサーバ構築したい
    初期費用なし、月数百円(1時間単位も可)で利用可能です!

 

以上!

コメント

タイトルとURLをコピーしました