Python
 Computer >> コンピューター >  >> プログラミング >> Python

Django REST FrameworkでJWT認証を実装する方法をわかりやすく解説

Django REST Framework(DRF)を使った開発経験がある方なら、JWT認証という言葉を一度は耳にしたことがあるでしょう。JWTは「JSON Web Token」の略称で、トークンベースの認証を実現する仕組みです。Djangoにおける認証方式として非常に人気が高く、APIのセキュリティ確保に広く活用されています。

この記事では、Django REST FrameworkでJWT認証を導入し、実際に動かすまでの手順をステップごとに解説します。

JWT認証とは

JWT認証は、ユーザー名とパスワードを使ってトークンを発行し、以降のリクエストではそのトークンを送信することで認証を行う方式です。セッションをサーバー側で管理する必要がないため、ステートレスなAPI設計と相性が良く、モバイルアプリやSPA(シングルページアプリケーション)との連携にも適しています。

必要なパッケージのインストール

まず、JWT認証に必要なパッケージをインストールしましょう。以下のコマンドを実行します。

pip install djangorestframework-simplejwt
pip install djangorestframework

「djangorestframework-simplejwt」は、Django REST Framework向けのJWT認証ライブラリで、シンプルな設定でトークンの発行・更新機能を提供してくれます。

なお、今回のチュートリアルでは専用のアプリを作成せず、Django REST Frameworkのフロントエンドと認証バックエンドの基本セットアップのみを行います。

settings.pyの設定

次に、settings.py に以下の設定を追加します。

INSTALLED_APPS = [
    ...
    'rest_framework_simplejwt',
    'rest_framework',
    ...
]
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

ここでは、「rest_framework」と「rest_framework_simplejwt」をアプリとして登録し、認証バックエンドとして「JWTAuthentication」を指定しています。これにより、すべてのAPIビューでデフォルトの認証クラスとしてJWT認証が使用されるようになります。

urls.pyの設定

続いて、プロジェクトの urls.py に以下のようにルーティングを追加します。

from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

ここで追加したのは2つのURLエンドポイントです。

  • /api/token/:ユーザー名とパスワードを送信すると、アクセストークンとリフレッシュトークンを発行するエンドポイント
  • /api/token/refresh/:発行済みのリフレッシュトークンを使って、新しいアクセストークンを取得するエンドポイント

アクセストークンには有効期限があるため、期限切れになった際はリフレッシュトークンを使って再取得します。これにより、ユーザーが再度ログインし直す手間を省くことができます。

動作確認

設定が完了したら、サーバーを起動して実際にトークンを発行してみましょう。ブラウザまたはPostmanなどのツールから /api/token/ にユーザー名とパスワードをPOSTすると、以下のようなJSON形式でトークンが返却されます。

{
    "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

取得したアクセストークンを、以降のAPIリクエストのAuthorizationヘッダーに「Bearer <access_token>」の形式で付与することで、認証が必要なエンドポイントへアクセスできるようになります。

まとめ

Django REST FrameworkにJWT認証を導入する方法を解説しました。ポイントは以下の3つです。

  • djangorestframework-simplejwt をインストールして INSTALLED_APPS に登録する
  • REST_FRAMEWORK 設定で JWTAuthentication をデフォルト認証クラスに指定する
  • TokenObtainPairView と TokenRefreshView をURLにルーティングする

わずかな設定だけで堅牢なトークンベース認証を実現できるので、API開発の際はぜひ活用してみてください。

  1. Djangoのモデルインスタンスに翻訳機能を追加する方法

    この記事では、Djangoの任意のモデルインスタンスに対して翻訳データを追加する方法を解説します。ID、名前、引用文、セリフなどのデータを保存し、それを複数の言語で表示したいケースはよくあります。通常はデータベース周りで多くの実装が必要になりますが、今回はわずか数行の設定で同じ結果を実現する方法をご紹介します。まずDjangoプロジェクトとアプリを作成し、urlsの設定やINSTALLED_APPSへのアプリ追加など、基本的なセットアップを行ってください。今回の作業では、views.py、urls.py、HTMLファイルにはほとんど手を加えません。主に扱うのはsettings.py、admin

  2. DjangoでMoneyフィールド(金額フィールド)を追加する方法を徹底解説

    Webサイトを開発していると、給与や料金、収入といった金額に関するデータを扱う場面がよくあります。Djangoには標準で整数型のフィールドが用意されていますが、金額データの処理には必ずしも適していません。そこで便利なのが、サードパーティ製ライブラリ「django-money」です。このライブラリを使えば、通貨情報付きのMoneyフィールドをモデルに簡単に追加できます。 この記事では、django-moneyを使ってDjangoモデルに金額フィールドを実装する手順を、サンプルコードとともにわかりやすく解説します。 事前準備:プロジェクトとアプリの作成 まずはDjangoプロジェクトとアプリを作