\ お問い合わせはこちら! /

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

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

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

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

karo

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

1. Basic認証(BasicAuthentication)

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

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

設定方法

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

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

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

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のエンドポイントに向かって、テストしてみましょう。

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

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

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

2. Session認証(SessionAuthentication)

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

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

設定方法

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

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

動作確認方法

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

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エラーが返ります。

3. トークン認証(TokenAuthentication)

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

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

設定方法

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

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

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

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

pip install djangorestframework
pip install djangorestframework.authtoken

INSTALLED_APPSauthtokenを追加します。

INSTALLED_APPS = [
    "rest_framework.authtoken",
]

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

python manage.py migrate

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

python manage.py drf_create_token <username>

動作確認

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

class MyView(APIView):
    permission_classes = [IsAuthenticated]

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

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

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

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

まとめ

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

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

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

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

CFXLOGのアバター CFXLOG プログラマ

メイン言語はPython。本ブログでは、実務や普段の学習で学んだことをアウトプットしています。
基本情報技術者試験合格者。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)