Django REST framework API実装:JWT認証機能の作成

Web APIの開発では、クライアントとサーバー間の「認証」が欠かせません。特にフロントエンドとバックエンドを分離する構成では、セッションベースよりも「トークンベース」の認証が主流です。
本記事では、Django REST framework(DRF)と djangorestframework-simplejwt を用いた JWT認証 の実装方法を紹介します。
目次
JWTとは?
JWT(JSON Web Token) は、ユーザー情報を含む署名付きのトークンで、APIへのアクセス制御に使われます。認証後に発行されたトークンは、クライアントが保存し、以降のリクエストで送信します。サーバーは署名を検証するだけで、ユーザー情報を復元できます。
メリット:
- スケーラブル(サーバー側でセッションを保持しない)
- SPA(シングルページアプリケーション)との相性が良い
- トークンの有効期限やリフレッシュ制御が可能
Simple JWT の導入
まずは必要なパッケージをインストールします。
pip install djangorestframework djangorestframework-simplejwt |
settings.py に以下を追加します:
REST_FRAMEWORK = { ‘DEFAULT_AUTHENTICATION_CLASSES’: ( ‘rest_framework_simplejwt.authentication.JWTAuthentication’, ),} |
認証用エンドポイントの追加
urls.py にJWT用のエンドポイントを追加します。
# myproject/urls.pyfrom django.urls import pathfrom rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView,) urlpatterns = [ path(‘api/token/’, TokenObtainPairView.as_view(), name=’token_obtain_pair’), # ログイン path(‘api/token/refresh/’, TokenRefreshView.as_view(), name=’token_refresh’), # リフレッシュ] |
エンドポイント例:
- POST /api/token/:アクセストークン・リフレッシュトークンを取得
- POST /api/token/refresh/:リフレッシュトークンからアクセストークンを再発行
クライアントからのリクエスト例
POST /api/token/Content-Type: application/json { “username”: “testuser”, “password”: “password123”} |
レスポンス例:
POST /api/token/Content-Type: application/json { “access”: “eyJ0eXAiOiJKV1QiLCJh…”, “refresh”: “eyJ0eXAiOiJKV1QiLCJhbGci…”} |
以降は、ヘッダーに以下を含めてリクエストします:
Authorization: Bearer <access_token> |
権限管理(Permissions)
JWTで認証した後、API単位で「誰が何をできるか」を制御するために、権限クラス(permissions) を活用します。
例:
from rest_framework.permissions import IsAuthenticated class PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer permission_classes = [IsAuthenticated] # 認証されたユーザーのみ |
トークンの有効期限・カスタマイズ
settings.py で有効期限などを細かく設定できます。
from datetime import timedelta SIMPLE_JWT = { ‘ACCESS_TOKEN_LIFETIME’: timedelta(minutes=15), ‘REFRESH_TOKEN_LIFETIME’: timedelta(days=1),} |
djangorestframework-simplejwt には、トークンの無効化 や カスタムクレーム の機能もあり、柔軟にカスタマイズ可能です。
まとめ
djangorestframework-simplejwt を使うことで、Django REST frameworkでの認証をセキュアに構築できます。アクセストークンとリフレッシュトークンを使い分けることで、UXとセキュリティのバランスも取りやすくなります。