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とセキュリティのバランスも取りやすくなります。