【Basic, Token, Session】デフォルトで用意された3つの認証クラス入門【Django REST Framework】

Django REST Framework(DRF)には、デフォルトで3つの認証機能が搭載されています。

認証機能は認証クラス(authentication classes)で設定し、リクエストが誰からのものかを識別します。

本記事では基本の、Basic認証Token認証Session認証の特徴と使いどころを比較しながら解説します。

karo

現代のAPI開発では、Token認証が一般的です。

いちばんシンプルな認証で、ユーザー名とパスワードをAuthorizationヘッダに含める方法です。

パスワードは暗号化されずに平文で送られるので、HTTPSは必須。開発・テスト用途向けの認証になります。

以下の設定により、BASIC認証がデフォルトの認証方式になります。

Python
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.BasicAuthentication",
    ]
}

BASIC認証をかけたいビューに、次のようなをpermission_classes追加します。

Python
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView


class PrivateView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({"message": f"Hello, {request.user.username}!"})

これにより、PrivateViewはBASIC認証が求められるようになります。

PrivateViewのエンドポイントに向かって、テストしてみましょう。

Bash
curl -u username:password http://localhost:8000/api/secure-endpoint/

前述のようにBASIC認証は暗号化せずにパスワードのやり取りを行います。

HTTPS化しないとパスワードが傍受される危険性があることは、十分認識しておきましょう。

Djangoのログインセッションと連動する認証です。

CSRFトークンが必要でクッキー認証なので、ブラウザとの連携なら相性が良いです。
一方で、ブラウザを使わないAPI単独としての用途には向きません。

以下の設定により、Session認証がデフォルトの認証方式になります。

Python
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.SessionAuthentication",
    ]
}

/admin/などでログインを済ませ、同じブラウザで以下のようなビューにアクセスできれば動作確認はOKです。

Python
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView


class SessionAuthCheckView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({"message": f"Session認証OK: {request.user.username}"})

ログイン時にsessionidクッキーがブラウザにセットされ、それを使って認証が行われることになります。

GETはCSRFトークン不要、POST/PUTなどはCSRFトークンがないと403エラーが返ります。

ユーザーごとに発行した固定トークンで、認証する方法です。

HTTPヘッダに送るので、HTTPS通信が必須であることに注意しましょう。

以下の設定により、トークン認証がデフォルトの認証方式になります。

Python
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.TokenAuthentication",
    ]
}

これまでの認証方式と違って、トークン認証は追加の設定が必要です。
※ 仕組み自体は実装されているが、準備しないと使えない

まずは必要なライブラリをインストールしましょう。

Bash
pip install djangorestframework

INSTALLED_APPSauthtokenを追加します。

Python
INSTALLED_APPS = [
    "rest_framework.authtoken",
]

マイグレーションを実施。

Bash
python manage.py migrate

あらかじめ、特定のユーザーにトークンを与えておきます。
このトークンを持っているユーザーは、認証に通過することができるようになります。

Bash
python manage.py drf_create_token <username>

認証が必要なビューを用意しておきましょう。

Python
class MyView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({"user": request.user.username})

上記で作ったエンドポイントに向かってリクエストを飛ばしてみましょう。

Bash
curl -H "Authorization: Token <your_token>" http://localhost:8000/api/secure-endpoint/

外部アプリやモバイルアプリとの連携、セッション不要でステートレスにしたいAPIなら便利な認証方式です。

それぞれの認証方式をまとめると、次のとおり。

認証方式特徴利点注意点
Basic認証ユーザー名・パスワードを毎回送信実装が簡単HTTPS必須
セキュリティに弱い
Session認証Djangoログインと連動Webアプリと親和性◎CSRFトークンが必要
Token認証トークンを使って認証モバイル・API向けトークン管理の仕組みが必要

用途や運用形態に応じて、適切な認証方式を選びましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段は主にPython開発をしています。
最近はAI駆動開発にも関わっています。

コメント

コメントする