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."}
参考
- DjangoでJWTを使ったトークン認証を実装する | らっちゃいブログ
- Django Rest Framework で JWTによるAPIの認証機能を実装 | Qiita
- Django REST framework JWT(公式)
- Django REST framework(公式)
関連情報
ConoHa上でDockerを導入したり、DjangoでWebアプリを立ち上げたりした内容を以下の記事でまとめました。こちらもよろしければご覧になってください。
広告
Djangoをやるなら以下の書籍がオススメです。
DjangoでWebアプリを開発するときの要点が分かりやすくまとめられています。
ConoHa VPS
は初期費用不要で月に数百円で利用できる仮想サーバのサービスです。以下のような方には非常にオススメのサービスとなっています!
- 勉強がてらLinuxの環境をちょっと触ってみたい
⇒管理者権限が実行可能なLinuxサーバ環境が構築可能です! - スモールスタートでサービスを提供して、うまくいったら規模をスケールアップしたい
⇒後からメモリサイズやCPU数などのスケールアップ/スケールダウン可能です! - AWSやGCPなどのクラウドサービスは高いので、もっと安くサーバ構築したい
⇒初期費用なし、月数百円(1時間単位も可)で利用可能です!
以上!
コメント